API関数(DLL)の呼び出しにおいて、DLLの格納場所は?

このQ&Aのポイント
  • API関数を格納しているDLLの格納場所について質問です。
  • VB.NETでAPI関数を呼び出す場合、DLLの格納場所はC:\Windows\System32である必要がありますか?
  • また、任意のフォルダにDLLを格納し、そこを参照できるようにすることは可能でしょうか?DLLは必ずSystem32フォルダに格納する必要があるのでしょうか?
回答を見る
  • ベストアンサー

API関数(DLL)の呼び出しにおいて、DLLの格納場所は?

お世話になります。 VB.NETでAPI関数を呼び出す場合にまず、API関数を格納しているDLLを宣言しなけれならないと下記URLにあります。 (http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html) (a)DllImport属性を利用する方法 <System.Runtime.InteropServices.DllImport("DLL名")> _ Function API関数名(仮引数) End Function (b)Declareステートメントを利用する方法 Declare Function API関数名 Lib "DLL名" (仮引数) そこで、質問なのですが、(a)、(b)どちらの方法で実現する場合においても、DLLの格納場所はC:\Windows\System32でないといけないのでしょうか?(実際にコーディングしてもSystem32フォルダにないとエラーになってしまいます。) 任意のフォルダにDLLを格納し、そこを参照できるようにできるのでしょうか? また、一般常識としてDLLはSystem32フォルダに格納しておかないといけないものなのでしょうか? 以上、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

DLL名にパスを含んでいない場合は 1) EXEファイルのカレントフォルダ 2) Windowsのシステムフォルダ(Win9x系ならWindows\Sysytem・WinNT系ならWindows\System32) 3) Winddows\Systemフォルダ 4) Windowsフォルダ 5) 環境変数PATHの設定フォルダ といった順番でDLLを探すと思います WinNT系へインストールする際にフォルダの権限などが原因で独自のDLLをWindows\System32へ書き込み出来ないとか アンインストールなどの機能を提供しない などの要因によって DLL自体を実行ファイルと同じフォルダに置くこともありますよ 『DLLを必ずWindows\System32に置きなさい』といった規約はありません

20centuryboy
質問者

お礼

返信が遅くなり申し訳ありません。 DLLの指定で絶対パスを入力していれば任意のパスで動作しました。 また、回答頂いた、1)~5)のパスにDLLを格納しても動作しました。 DLLはアプリケーション作成者が任意のパスに格納して、おけばいいのですね。 どうも、的確なご回答をいただきありがとうございました。

関連するQ&A

  • VB.NET DLL【API関数(コールバック関数)】の呼び出し方法について

    目的は下記(3)のAPI関数をVB.NETで呼び出したいのですが、そこにいきつくまでにいろいろと壁にぶちあたっております。 (1)API関数をVB.NETから利用するにあたって どのような手順および調査・学習すればVB.NETからWin32 APIを独力で呼び出せるようになるのでしょうか?ネット上に情報が乏しく、いきずまっております。 (2)API関数の調査方法、またコールバック関数について 下記(a),(b)のようにWin32 API関数を宣言して、あとは呼び出し側の関数で(a),(b)で宣言したAPI関数を記述するだけで基本的には使用できるようになるという大まかなイメージはつかめております。 このあとでAPI関数をMSDNで調べると引数がHWNDやPCTSTRなど見慣れないものが出てきて、次のURL(http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html)を見ると、APIの型とVB.NETの型は違うので型変換をしなければならないとあります。またさらに私が呼び出したい関数はコールバック関数なるものでこれまた?な状態です。 そこでAPIとVB.NETの型変換の調査方法およびコールバック関数の利用方法などを教えていただけないでしょうか? (a)DllImport属性を利用する方法 <System.Runtime.InteropServices.DllImport("DLL名")> _ Function API関数名(仮引数) End Function (b)Declareステートメントを利用する方法 Declare Function API関数名 Lib "DLL名" (仮引数) (3)InstallHinfSection関数(http://msdn2.microsoft.com/en-us/library/aa376957.aspx)について 下記のコードを実行したのですが、実行時エラーにはならないのですが、APIの関数が動作してくれません。どこが悪いのかがまったく見当がつかないのですがどなたかアドバイスいただけると助かります。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click InstallHinfSection(Nothing, Nothing, "DefaultInstall 132 C:\INF_TEST\Original.inf", 0) End Sub   Declare Function InstallHinfSection Lib "setupapi" Alias "InstallHinfSection" (ByVal hwnd As String, ByVal ModuleHandle As String, ByVal CmdLineBuffer As String, ByVal nCmdShow As Integer) As Long APIが難しすぎていろいろとおかしなことを書いているかもしれませんが、どうぞよろしくお願いいたします。

  • VBAでDLL呼び出し

    VBAに関する使用方法をお教えください。 例えばsheet1のA1の数値をVBC++で作成したDLLファイル内にある関数に引数として渡したいのですが、どうすればよいでしょうか? (どう記述すればよいのでしょうか) 初心者につき、分かりやすく説明をして頂ければ幸いです。 VBC++で作成したDLLファイル名 testdll.dll testdll.dll内で定義してある関数名はtest_sendです 以上、宜しくお願い致します。

  • APIの呼び出しDLLファイルの場所を変化させたい

    VB.NETからDLLを呼び出したいのですが、これが私のコンピューターと 顧客側のコンピュータとで環境が違う為、毎回ファイルの場所を変えて 使用しています。(ソース内のファイル場所を毎回書き換える) これを、hostnameの取得により、私のパソコンとその他の環境とで 呼び出す状況を変えたいと思っております。 どの様にすれば良いか、教えて下さい。 Windowsの環境変数のPATHに書き込みはしたくありません。 あくまで、プログラム内で終わらせたいのですが・・ (ソース例) ’↓固定変数でないとダメ? Public Const MyDllFileName As String = "\\ServerName\Kyouyu\MyDllFile.dll" 'Type(1) Public Declare Function ExportDLL1 Lib MyDllFileName (ByRef MyData As MyStructure) As Integer 'Type(2) <DllImport(MyDllFileName)> Public Function ExportDLL2(ByRef MyData As MyStructure) As Integer End Function

  • DLL の中の関数呼び出し

     Windows NT workstation Ver4.0 の上で、ボーランドC++ Ver5 を使って、owl を使ったソフトを作っています。  メーラーを作ろうとして、blatj のソースコードを組み込んでいます。 その中で、gensock.dll を読み込んで、その中の関数を呼び出すところがあるのですが、関数のエイトりーポイントが NULL で返ってきます。  自作した他の DLL については、関数の呼び出しは、 順調なのですが、この gensock.dll については上手くゆかないのです。  そこで、 ボーランドのDLLと、マイクロソフトのDLLでは 呼び出し方にどのような違いがあるのでしょうか?  Win API を使ってみても  TModule を使ってみても 同じような現象が起きています。  解決方法は gensock.dll のソースコード を使ってボーランドのコンパイラでDLLを作り直す以外には無いのでしょうか?

  • C#: DLL関数に整数の参照を渡すには?

    前略  @IT の”Win32 APIやDLL関数を呼び出すには?”(下記URL)を読んでVisual Studio 2012のC#をつかって、DLL関数に整数の参照を渡すプログラムをつくったのですが期待通り動作しません。 http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html  以下のソースコードのどこが間違っているのでしょうか? わかる方がいらっしゃったら教えてください。  ・マウスのボタンの数を取得して ラベルとメッセージボックスに表示するプログラムですが、いずれも 初期値の8が表示されて 参照による取得がうまくできません。また、GetNumberOfConsoleMouseButtons( ) の戻り値もFlase(0)が表示されます。  ・GetNumberOfConsoleMouseButtons( ) の諸元は下記です。 BOOL GetNumberOfConsoleMouseButtons( LPDWORD lpNumberOfMouseButtons // ボタン数のアドレス ); パラメータ lpNumberOfMouseButtons: マウスのボタン数を受け取る 32 ビット変数へのポインタを指定します。 戻り値 関数が成功すると、0 以外の値が返ります。 関数が失敗すると、0 が返ります。 以上、よろしくお願いします 以下、Form1.cs 全ソースコードです。 //---------------------------------------------------------- using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices; // 追加 namespace DLL_呼出し_参照 { public partial class Form1 : Form { //宣言部 [DllImport("kernel32.dll")] extern static bool GetNumberOfConsoleMouseButtons(ref uint lpNumberOfMouseButtons); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { uint Num; bool Flag; Num = 8; Flag = GetNumberOfConsoleMouseButtons(ref Num); //関数の呼び出し label1.Text = Num.ToString(); label2.Text = Flag.ToString(); //戻り値 成功すると0以外が戻る string msg = String.Format("Num={0}",Num); MessageBox.Show(msg); //メッセージボックス表示 } } }

  • VC++のDLLをVB6.0からVB.NETへ移行する方法

    はじめて投稿します。 今、現状VB6.0のプログラムで使用しているVC++のDLLを VB.NETで使用できるように、VB.NETのソースの改修をしています。 (開発環境は、VisualStudio.NET 2003) たいていのDLLは、DllImportを行うことで VB.NETから使用できることを確認しました。 /*--(例)------------------------------------------*/ Imports System.Runtime.InteropServices <DllImport("DLLTest.dll")> _ Private Shared Function DLLTestMethod() As Integer End Function /*------------------------------------------------*/ しかし、苦戦しているDLLファイルがあって、 そのソースを見ると、COMで実装されているようで、 コンパイルしたらタイプライブラリファイルが作成されています。 またDLLのレジストリも登録されているようです。 VB6.0でどう使われているか確認したところ、 そのDLLの参照設定をしていて、 "Public obj As New クラス名"でクラス宣言した後、 obj.関数名()で処理を行っています。 VB.NETでいろいろ試行錯誤してみましたが 参照設定はできるものの、その後で手詰まりになっています。 (参照設定しても、灰色になっているクラス名が存在するので 正しく設定できているかも怪しい状態) (1)----------------------------------------------- 参照設定後、オブジェクトブラウザから見えるクラスをNewして そのメンバ関数を使用する方法 -------------------------------------------------- (結果) レジストリ登録をしていないと 「CLSID{・・・}のCOMオブジェクトが有効でない」云々というエラーに。 それを受けて手動で該当するDLLのレジストリ登録を行った後だと 「オブジェクト参照がオブジェクトインスタンスに設定されません」というエラー。 (ということは、クラス生成に失敗している?) (2)----------------------------------------------- 上記のようにDllImportで実装する方法 (ちなみにそのDLLがエクスポートしている関数は DllCanUnloadNow, DllGetClassObject, DllRegisterServer, DllUnregisterServerの4つ) -------------------------------------------------- (結果) DllGetClassObject以外については関数を呼ぶことができている。 DllGetClassObjectは、引数設定に苦戦して今のところうまくいっていない状態。 (3)----------------------------------------------- インスタンス生成ができていないようなので どこかで調べて見つけてきたCoCreateInstance関数を使用する方法 -------------------------------------------------- (結果) これも引数に何を渡してよいかわからず試行錯誤中。 DLLの読み込みの時点でこけているかと予測して そのあたりが解決すればよいのかな・・・といろいろ試していますが WindowsプログラミングやCOMがよくわかっていないので 何が正解で何が間違っているのかさっぱりわからず、 周りに聞いても精通している人がいないためどうしようもなくなっています。 どんな些細な手がかりでもよいので 突破口になりそうなアドバイスがあれば教えてください。 よろしくお願いします。

  • C++製DLLにてVB.NET関数を引数付きでコールバックしたい。

    C++製DLLにてVB.NET関数を引数付きでコールバックしたい。 以下のようなソリューションがあります。 ソリューションには、VB.NETによるプロジェクトapp、C++によるプロジェクトdllがあり、 名前のとおり、appはWindowsフォームアプリケーション、dllはクラスライブラリです。 *** VisualStudio.NET 2003 ソリューション *** === VB.NETプロジェクト:app.exe === --- Module1.vb --- Module Module1 Delegate Function _t() As Int32 <System.Runtime.InteropServices.DllImport("dll.dll")> Public Function dllfunc(ByVal lpFunc As _t) As Int32 End Function End Module --- Form1.vb --- Public Class Form1 Inherits Form Private button1 As Button Public Sub New() button1 = New Button button1.Parent = Me : button1.Text = "button1" AddHandler button1.Click, AddressOf MyClass.GetEvent End Sub Private Sub GetEvent(ByVal sender As Object, ByVal e As EventArgs) dllfunc(AddressOf func1) End Sub Public Function func1() As Int32 MsgBox("func1@vb.net") Return 123 End Function End Class === C++ライブラリプロジェクト:dll.dll === --- dll.def --- LIBRARY dll EXPORTS dllfunc --- dll.h --- #ifdef DLL_EXPORTS #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif DLL_API void dllfunc(int* vbfunc(void)); -- dll.cpp --- #include "stdafx.h" #include "dll.h" #include "stdio.h" #include "windows.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return true; } DLL_API void dllfunc(int* vbfunc(void)) { char str[16]; sprintf(str,"vbfunc() = %d",vbfunc()); MessageBoxA(NULL,str,"dll",MB_OK); } --- stdafx.cpp, stdafx.h --- (省略) *** ソリューション ここまで *** [ 動作 ] appを実行すると、Form1にbutton1が生成される。 button1をクリックするとGetEventが呼ばれ、func1のアドレスを引数としたdllfunc()を呼びます。 dll側のdllfunc()から、app側のfunc1()を呼び、戻り値の123を表示します。 [ 質問 ] dllfunc()から引数付きでfunc1()を呼びたいが、記述の方法が分かりません。 ご教示お願い致します。

  • VBAでDLLが見つからないエラー

    CADのVBA(6.0)ですが、DLLが見つからないエラーが出ます ' こっちはエラーが出ない Public Declare Function SearchVBApath Lib _ "C:\Program Files\AppliTool\VB\DDDD.dll" (ByVal env As String, ByVal s As String) As Integer 'こっちだとエラーが出る Public Declare Function SearchVBApath Lib "DDDD.dll" (ByVal env As String, ByVal s As String)    As Integer VBAプロジェクトファイルとDLLは同じフォルダにおいてあります 上記のようにフルパスだとエラーが出ないのですがDLL名だけだとこの関数のところでエラーがでます このDLL関数宣言行の前の方には他のDLL関数も同じようにパス省略で記述しているのですがそちらにはエラーが出ません どなたかヒント下さい、よろしくお願いします。

  • dllの呼び出しで引数が渡らないらしい

    dllの呼び出しで引数が渡らないらしい 50間近になって.NETにチャレンジ。日々?!?の毎日です。 ネットに転がっていた「静的にdllを引用する」コードは動きました。が、「動的にdllを引用」するコードをネットからかき集めてくみ上げましたが引数が旨く渡らないのか、思うように動きません。当該dllはgogo.dllで有名だと思います。 正直、ManagedとUnmanagedのメモリ管理とか、呼び出しの引数の渡し方も理解していません。見よう見まね状態ですが、どうしても当該dllを使いたいので掲載してしまいました。(^_^; 下記の問題が2つ 1)引数に「ref」を付けないと「保護されたメモリ…」のエラーが発生してしまう。  たぶん、このような現象が出ること自体に呼び出し方の問題がある? 2)最終的にファイル名fnがdll側に旨く渡っていないように思える。  Marshal…を使うのかも知れませんが、よくわかりません。 素人質問で恐縮ですが、下記のような動的なdllの引用で、静的な引用と同じように動くコードの書き方を教えて下さい。言語はc#です。 下記がコードですが、文字数削るためかなり行を削っています。初期化とかはちゃんとコーディングしています。 [静的にdll引用=>正常終了] [DllImport("gogo.dll", EntryPoint = "MPGE_setConfigure")] static extern int MPGE_setConfigureStrings(int mode, int dwPara1, string dwPara2); (中略) string fn = "D:\\test.wav"; i = MPGE_setConfigureStrings(1, 0, fn); =>この後、test.wavに対しての処理で正常終了が返る(^_^) [動的にdllを引用=>ダメ] [DllImport("kernel32")] static extern int LoadLibrary(string lpLibFileName); [DllImport("kernel32")] static extern IntPtr GetProcAddress(int hModule, string lpProcName); [UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Ansi)] delegate int d_MPGE_setConfigure(ulong mode, ref ulong dwPara1, string dwPara2); [MarshalAs(UnmanagedType.FunctionPtr)] static d_MPGE_setConfigure e_MPGE_setConfigure; (中略) IntPtr p_MPGE_setConfigure = GetProcAddress(dllHandle, "MPGE_setConfigure"); e_MPGE_setConfigure = (d_MPGE_setConfigure)Marshal.GetDelegateForFunctionPointer(p_MPGE_setConfigure, typeof(d_MPGE_setConfigure)); string fn = "D:\\test.wav"; ulong p1 = 0; i = e_MPGE_setConfigure(1, ref p1, fn); =>この後、dllからtest.wavが読み込めない旨のメッセージが吐かれる(T.T) 以上です。

  • APIって

    VBで簡単なプログラムを作成しています。 APIも便利なのでサンプルを見ながら使っていますが ふと疑問に思ったので教えて下さい。 以下の"advapi32.dll"と"ADVAPI32"の違いは何なのでしょうか。 大文字、小文字の違いだけで同じなのですか? dllを省略すると引数に&をつけるつけないの違いが出るのでしょうか? 'レジストリの値を取得する Public Declare Function RegQueryValueExstr Lib "ADVAPI32" Alias "RegQueryValueExA" (ByVal hKey&, ByVal lpValueName$, ByVal lpReserved&, ByVal lpType&, ByVal lpData$, lpcbData&) As Long 'レジストリの値を設定する Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As Any, ByVal cbData As Long) As Long ネット上にたくさんサンプルはあるので、やりたいことの方法を調べてできればOKといったやり方です。 きちんと勉強したい気持ちもありますので、参考書籍等紹介して頂いてもうれしいです。