「ライブラリの基礎 - C++DLL」の版間の差分
ナビゲーションに移動
検索に移動
編集の要約なし
編集の要約なし |
|||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
C# EXEからC++ DLLへ様々なデータ型の変数を渡したいときがある。 | C# EXEからC++ DLLへ様々なデータ型の変数を渡したいときがある。<br> | ||
<br> | |||
例えば、C++ DLLから次のような関数がエクスポートされているとする。 | 例えば、C++ DLLから次のような関数がエクスポートされているとする。<br> | ||
<source lang="c++"> | <source lang="c++"> | ||
void WINAPI ConvertToShort(char *pstr, short *pret); | void WINAPI ConvertToShort(char *pstr, short *pret); | ||
</source> | </source> | ||
<br> | <br> | ||
上記の関数において、C# EXEから使用するときは、char*型は文字列なのでstring型を渡す。 | 上記の関数において、C# EXEから使用するときは、char*型は文字列なのでstring型を渡す。<br> | ||
short*型はIntPtr型を渡す。(IntPtr型は汎用ポインタを表す型であり、void*型とほぼ同義) | short*型はIntPtr型を渡す。(IntPtr型は汎用ポインタを表す型であり、void*型とほぼ同義)<br> | ||
<br> | |||
但し、C#は厳しい型付け言語なので、曖昧さを解決するために変換メソッドを経由する必要がある。 | 但し、C#は厳しい型付け言語なので、曖昧さを解決するために変換メソッドを経由する必要がある。<br> | ||
具体的には、IntPtr型の変数にMarshal.AllocHGlobal関数で必要なサイズのメモリを確保して、それをC++ DLLに渡した後、 | 具体的には、IntPtr型の変数にMarshal.AllocHGlobal関数で必要なサイズのメモリを確保して、それをC++ DLLに渡した後、<br> | ||
Marshal.ReadInt16関数(型によって異なる)等で変換した後、確保したメモリをMarshal.FreeHGlobal関数で解放するというプロセスを経る必要がある。 | Marshal.ReadInt16関数(型によって異なる)等で変換した後、確保したメモリをMarshal.FreeHGlobal関数で解放するというプロセスを経る必要がある。<br> | ||
<br><br> | |||
== サンプルコード == | == サンプルコード == | ||
| 39行目: | 39行目: | ||
WindowsのDLL(Win32 API)と.NET Frameworkでは型の管理方法が違うため、実際には型の相互変換(マーシャリング)が行われる。<br> | WindowsのDLL(Win32 API)と.NET Frameworkでは型の管理方法が違うため、実際には型の相互変換(マーシャリング)が行われる。<br> | ||
尚、BOOL型の実体はLONG型と同じなので、boolの代わりにintを指定することも可能である。<br> | 尚、BOOL型の実体はLONG型と同じなので、boolの代わりにintを指定することも可能である。<br> | ||
<br> | |||
<center>'''表1. Win32 APIでの型名と対応するC#の型'''</center> | <center>'''表1. Win32 APIでの型名と対応するC#の型'''</center> | ||
<center> | <center> | ||