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)
以上です。
お礼
回答ありがとうございます。 system32フォルダにdllとlibを放り込んだら dllは見つかりました。 できれば他の方を含めて、 system32に放り込まずに出来る方法を 教えていただけたら幸いです。