P/Invokeを試してみた

.NET Frameworkが2.0になろうが、Win32APIは必要になる。そこで、C++/CLIではどれほど楽になったか試してみました。



まずはMessageBox関数でも。ヘルプを見ながら以下のように宣言(C#風のようだ)。

using namespace System::Runtime::InteropServices;
[DllImport("user32.dll")]
extern "C" int MessageBox(int, String^, String^, UInt32);

で、このように利用。

MessageBox(0/*HWND_DESKTOP*/, "", "", 0/*MB_OK*/);

あれ・・・普通に動きました。

MC++はもっと「殺伐としているべき」です。
ちょっと属性の部分をいじると、CやPascalの関数も直接よべちゃいます。
たとえばこんな感じ。

[DllImport("myfunc.dll"), CallingConvention=CallingConvention::Cdecl]
extern "C" int MyFunction(int);

要するに呼び出し規約を理解していれば簡単。

そのほかにも以下の属性がありました。

  • WindowsAPIのGetLastErrorに値を格納するSetLastError
  • WindowsAPIのUNICODE版とMBCS版を容易に切り替えるCharSet
  • HRESULT型を返却する関数に対応するためのPreserveSig

あっけなくてつまらないため、次は引数を自前でマーシャリングして苦しむ記事を書いてみることにします。



[MSDN] — アンマネージ DLL 関数の処理

Leave a Reply

1 Comment on "P/Invokeを試してみた"

Notify of
avatar
Sort by:   newest | oldest | most voted
Anonymous
Guest

殺伐としているべき吹いた

wpDiscuz