C#のWin32DLL呼び出しが、Vistaでのみ例外
- 題名: C#のWin32DLL呼び出しが、Vistaでのみ例外
- 著者: とおりすがり
- 日時: 2007/12/05 14:25:06
- ID: 21095
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: C#のWin32DLL呼び出しが、Vistaでのみ例外
- 著者: Hongliang
- 日時: 2007/12/05 17:26:18
- ID: 21096
- この記事の返信元:
- この記事への返信:
-
[21097] うごきました! とおりすがり 2007/12/05 18:02:59
- ツリーを表示
- 題名: うごきました!
- 著者: とおりすがり
- 日時: 2007/12/05 18:02:59
- ID: 21097
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: うごきました!
- 著者: Hongliang
- 日時: 2007/12/05 22:10:09
- ID: 21098
- この記事の返信元:
-
[21097] うごきました! とおりすがり 2007/12/05 18:02:59
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: うごきました!
- 著者: とおりすがり
- 日時: 2007/12/05 22:37:18
- ID: 21099
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
Win32 DLLであるmp3infp.dllを使ってmp3のタグを読み取るC#のプログラムを作っています。
WindowsXPの頃は、以下のプログラムで正常に動いていました。
ところがVistaに変えたとたん、mp3infp_GetValue関数をコールすると例外が発生するようになりました。
プログラムのコンパイルにはエラーはなく、実行時にVistaでのみ例外が出る状態です。
[DLLのCのヘッダの宣言]
BOOL __stdcall mp3infp_GetValue(const char *szValueName,char **buf);
[C#のプログラム]
[System.Runtime.InteropServices.DllImport("mp3infp.dll")]
extern static private bool mp3infp_GetValue( string szValueName, ref StringBuilder buf );
StringBuilder buf = new StringBuilder(256);
mp3infp_GetValue("INAM_v2", ref buf);
よく調べてみると、refをつけた引数を使う関数で例外がでるようです。StringBuilderではなくbyte[]を使った呼び出しなど試してみましたが、やはりrefを付けると例外がでます。char**なのでrefは必要ですし・・
ちなみに上記の呼び出し方はXP時代に一般的に使われていた方法のようで、私もネットを参考にして知りました。
ちなみにmp3infp.dllを使用した本家のネイティブアプリはVistaでもきちんと動作しました。最新ベータバージョンのDLLも同様で、本家は動きますがC#からの呼び出しで例外がでます。
もしかしてVistaでは.NETからの外部Win32 DLLの呼び出し方で文字列ポインタのポインタを与える時に、何か仕様変更というか注意点があるのでしょうか?それとも、mp3infp.dllの問題?私の環境特有の問題?
まったくわからずにお手上げです。もし同様の現象の方、あるいは解決法をご存じの方がいたらご教示ください。
Windows Vista Professional
Visual C# 2005 ExpressEdition
mp3infp v2.54a(http://www.win32lab.com/fsw/mp3infp/)
mp3infp 2.55beta1(http://www.win32lab.com/bbs2/index.cgi?no=9290&mode=allread)