「ライブラリの基礎 - C++DLL」の版間の差分

ナビゲーションに移動 検索に移動
編集の要約なし
(Wiki がページ「C Sharp - C++DLL」を「C Sharpの基礎 - C++DLL」に、リダイレクトを残さずに移動しました)
編集の要約なし
1行目: 1行目:
== 概要 ==
== 概要 ==
C# EXEからC++ DLLへ様々なデータ型の変数を渡したいときがある。<br>
C# EXEからC++ DLLへ様々なデータ型の変数を渡したいときがある。<br>
<br><br>
== DllImport属性 ==
<code>DllImport</code>属性には、DLLファイルのパスを指定する以外にも、下表のような引数を与えることができる。<br>
他にも、細かい設定をするための引数が用意されているので、<code>DllImportAttribute</code>クラスで検索すること。<br>
<center>
{| class="wikitable"
|-
! 名称 !! 説明
|-
| CallingConvention || エントリポイントの呼び出し規約を明示的に指定できる。<br>指定なしの場合は__stdcallとなる。
|-
| CharSet || 文字列パラメータをメソッドにマーシャリングし、名前マングルを制御する方法を指定する。<br>文字コードの相互変換する時に指定する。
|-
| EntryPoint || 呼び出すDLLエントリポイントの名前または序数を指定する。<br>DLLの関数名とC#上で使用する関数名を異なる名前にする時に指定する。
|}
</center>
<br><br>
== C#のデータ型とWindows APIのデータ型 ==
<center>
{| class="wikitable"
|-
! Windows APIのデータ型<br>(括弧内は対応するC言語の型) !! 対応するC#のデータ型<br>(括弧内は.NET Frameworkでの型名) !! 備考
|-
| HANDLE (void *) || System.IntPtr<br>System.UIntPtr || x86は4バイト<br>x64は8バイト
|-
| BYTE (unsigned char) || byte (System.Byte) ||
|-
| SHORT (short) || short (System.Int16) ||
|-
| WORD (unsigned short) || ushort (System.UInt16) ||
|-
| INT (int)<br>LONG (long) || int (System.Int32) ||
|-
| UINT (unsigned int)<br>DWORD, ULONG (unsigned long) || uint (System.UInt32) ||
|-
| BOOL (long) || bool (System.Boolean) ||
|-
| CHAR (char) || 文字を渡すとき<br>char (System.Char)<br>文字を受け取るとき<br>StringBuilder ||
|-
| WCHAR(wchar_t) || 文字を渡すとき<br>char (System.Char)<br>文字を受け取るとき<br>StringBuilder ||
|-
| LPSTR (char *, char[])<br>LPWSTR (wchar_t *, wchar_t[]) || 文字を渡すとき<br>string (System.String)<br>文字を受け取るとき<br>System.Text.StringBuilder ||
|-
| LPCSTR (const char *, const char[])<br>LPCWSTR (const wchar_t *, const wchar_t[]) || 文字を渡すとき<br>string (System.String)<br>文字を受け取るとき<br>System.Text.StringBuilder ||
|-
| FLOAT (float) || float (System.Single) ||
|-
| DOUBLE (double) || double (System.Double) ||
|}
</center>
<br><br>
<br><br>


== サンプルコード ==
== サンプルコード ==
==== サンプルコード 1 ====
例えば、C++ DLLから次のような関数がエクスポートされているとする。<br>
例えば、C++ DLLから次のような関数がエクスポートされているとする。<br>
  <source lang="c++">
  <source lang="c++">
42行目: 95行目:
なお、Windows APIではBOOL型の実体はLONG型なので、.NET Frameworkではboolの代わりにintを指定することも可能である。<br>
なお、Windows APIではBOOL型の実体はLONG型なので、.NET Frameworkではboolの代わりにintを指定することも可能である。<br>
<br>
<br>
<center>'''表. Windows APIの型と対応するC#の型'''</center>
==== サンプルコード 2 ====
<center>
{| class="wikitable"
|-
! APIの型名<br>(括弧内は対応するC言語の型) !! 対応するC#の型<br>(括弧内は.NET Frameworkでの型名) !! 備考
|-
| HANDLE (void *) || System.IntPtr<br>System.UIntPtr || x86は4バイト<br>x64は8バイト
|-
| BYTE (unsigned char) || byte (System.Byte) ||
|-
| SHORT (short) || short (System.Int16) ||
|-
| WORD (unsigned short) || ushort (System.UInt16) ||
|-
| INT (int)<br>LONG (long) || int (System.Int32) ||
|-
| UINT (unsigned int)<br>DWORD, ULONG (unsigned long) || uint (System.UInt32) ||
|-
| BOOL (long) || bool (System.Boolean) ||
|-
| CHAR (char) || 文字を渡すとき<br>char (System.Char)<br>文字を受け取るとき<br>StringBuilder ||
|-
| WCHAR(wchar_t) || 文字を渡すとき<br>char (System.Char)<br>文字を受け取るとき<br>StringBuilder ||
|-
| LPSTR (char *, char[])<br>LPWSTR (wchar_t *, wchar_t[]) || 文字を渡すとき<br>string (System.String)<br>文字を受け取るとき<br>System.Text.StringBuilder ||
|-
| LPCSTR (const char *, const char[])<br>LPCWSTR (const wchar_t *, const wchar_t[]) || 文字を渡すとき<br>string (System.String)<br>文字を受け取るとき<br>System.Text.StringBuilder ||
|-
| FLOAT (float) || float (System.Single) ||
|-
| DOUBLE (double) || double (System.Double) ||
|}
</center>
<br><br>
 
== サンプルコード ==
C++ DLLの作成方法は[[ライブラリの基礎 - DLLの作成(C/C++/MFC)|ライブラリの基礎 - DLLの作成(C/C++/MFC)]]を参照する。<br>
C++ DLLの作成方法は[[ライブラリの基礎 - DLLの作成(C/C++/MFC)|ライブラリの基礎 - DLLの作成(C/C++/MFC)]]を参照する。<br>
<br>
<br>
314行目: 332行目:
  }
  }
  </source>
  </source>
<br>
<code>DllImport</code>属性には、DLLファイルのパスを指定する以外にも、下表のような引数を与えることができる。<br>
他にも、細かい設定をするための引数が用意されているので、<code>DllImportAttribute</code>クラスで検索すること。<br>
<center>
{| class="wikitable"
|-
! 名称 !! 説明
|-
| CallingConvention || エントリポイントの呼び出し規約を明示的に指定できる。<br>指定なしの場合は__stdcallとなる。
|-
| CharSet || 文字列パラメータをメソッドにマーシャリングし、名前マングルを制御する方法を指定する。<br>文字コードの相互変換する時に指定する。
|-
| EntryPoint || 呼び出すDLLエントリポイントの名前または序数を指定する。<br>DLLの関数名とC#上で使用する関数名を異なる名前にする時に指定する。
|}
</center>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C_Sharp]]
[[カテゴリ:C_Sharp]]

案内メニュー