|
|
|
Unmagaged Code
との相互運用について、本当はこんなことしたくないんだけど、どうしても使わざるを得ないときがあるので、メモっておきます。
|
|
(1) GotDotNet (2) MSDN
|
|
たとえば、User32.dll の MessageBox 関数を指定する場合、
[DllImport("user32.dll", EntryPoint="MessageBox")]
public static extern int MsgBox(int hWnd, String text,
String caption, uint type);
このときの DllImport のパラメータは次のとおり。
フィールド |
デフォルト値 |
説明 |
EntryPoint | - | 呼び出される DLL エントリ ポイント。 定義内の関数の名前が DLL 内のエントリ ポイントと同じである場合は、明示的に指定する必要はありません。 |
CharSet | CharSet.Ansi | 一部の API は、文字列引数がナロー (ANSI) とワイド (Unicode) の 2
つの関数のバージョンをエクスポートするものがあります。 このような場合に、CharSet を指定します。 例: MessageBoxA ...ANSI MessageBoxW ...Unicode |
ExactSpelling | プログラミング言語によって異なる。 | エントリ ポイントが文字セットに合わせて変更されることを防ぎます。 |
CallingConvention | WinAPI | メソッドに引数を渡すときに使われる呼び出し規約の値を指定します。 |
PreserveSig | True (シグネチャの変換抑止) | マネージ メソッド シグネチャが HRESULT を返すアンマネージ
シグネチャに変換されることを抑止します。また、マネージ メソッド シグネチャが戻り値に [out, retval]
引数が追加される可能性があることを示します。 |
SetLastError | False(C#, C++) True(VB) | 呼び出し元が Marshal.GetLastWin32Error API
関数を使って、メソッドの実行中にエラーが発生したかどうかを判断できるようにします。 |
|
|
Win32 API
を呼び出すにあたり、引数の受け渡しが必要になりますが、これらのデータ型がちゃんとあっている必要があります。 データ型は次の表になりますが、詳細はMSDN
を参照してください。
Wtypes.h に含まれるアンマネージ型 | アンマネージ C 言語型 | マネージ クラス名 | 説明 |
HANDLE
| void* | System.IntPtr | 32 ビット |
BYTE | unsigned char | System.Byte | 8 ビット |
SHORT | short | System.Int16 | 16 ビット |
WORD | unsigned short | System.UInt16 | 16 ビット |
INT | int | System.Int32 | 32 ビット |
UINT | unsigned int | System.UInt32 | 32 ビット |
LONG | long | System.Int32 | 32 ビット |
BOOL | long | System.Int32 | 32 ビット |
DWORD | unsigned long | System.UInt32 | 32 ビット |
ULONG | unsigned long | System.UInt32 | 32 ビット |
CHAR | char | System.Char | ANSI により装飾。 |
LPSTR | char* | System.String または System.StringBuilder | ANSI により装飾。 |
LPCSTR | Const char* | System.String または System.StringBuilder | ANSI により装飾。 |
LPWSTR | wchar_t* | System.String または System.StringBuilder | Unicode により装飾。 |
LPCWSTR | Const wchar_t* | System.String または System.StringBuilder | Unicode により装飾。 |
FLOAT | Float | System.Single | 32 ビット |
DOUBLE | Double | System.Double | 64 ビット |
注意 |
アンマネージコードから文字列が返される場合、System.String を使用すると String
は変更不可(Imutable)なので、関数から戻ったときに、文字列がコピーされません。このため、アンマネージコードから文字列が返される場合は、次のように
System.StringBuilder を使う必要があります。 |
|
|
文字列を渡す。 |
この場合は、System.String でOK。
[DllImport("kernel32.dll", EntryPoint="WritePrivateProfileString")]
private static extern uint WritePrivateProfileString( string
lpApplicationName, string lpEntryName, string lpEntryString, string
lpFileName );
WritePrivateProfileString( "SECTION", "ENTRY", str,
"C:\\TEMP\\TEST.ini" );
|
文字列を受け取る。 |
文字列を受け取るためのバッファには、StringBuilder
を使う必要があります。 というのは、string は、immutable
(変更できない)ので、GetPrivateProfileStringからの文字列を受け取ることができないためです。 このために、StringBuilder を使って、バッファとして渡してあげる必要があります。
uint entryLength; string strEntryStringValue;
[DllImport("kernel32.dll", EntryPoint="WritePrivateProfileString")]
System.Text.StringBuilder strEntryString = new
System.Text.StringBuilder( 256 ); entryLength = GetPrivateProfileString( "SECTION", "ENTRY",
"Nothing", strEntryString, (uint)(strEntryString.Capacity),
"C:\\TEMP\\TEST.ini" ); strEntryStringValue = strEntryString.ToString(); |
|
|
2003/5/31 初版作成
|