「ライブラリの基礎 - 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>
匿名利用者

案内メニュー