MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
ライブラリの基礎 - C++DLLのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
ライブラリの基礎 - C++DLL
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == C# EXEからC++ DLLへ様々なデータ型の変数を渡したいときがある。<br> <br> 例えば、C++ DLLから次のような関数がエクスポートされているとする。<br> <source lang="c++"> void WINAPI ConvertToShort(char *pstr, short *pret); </source> <br> 上記の関数において、C# EXEから使用するときは、char*型は文字列なのでstring型を渡す。<br> short*型はIntPtr型を渡す。(IntPtr型は汎用ポインタを表す型であり、void*型とほぼ同義)<br> <br> 但し、C#は厳しい型付け言語なので、曖昧さを解決するために変換メソッドを経由する必要がある。<br> 具体的には、IntPtr型の変数にMarshal.AllocHGlobal関数で必要なサイズのメモリを確保して、それをC++ DLLに渡した後、<br> Marshal.ReadInt16関数(型によって異なる)等で変換した後、確保したメモリをMarshal.FreeHGlobal関数で解放するというプロセスを経る必要がある。<br> <br><br> == サンプルコード == 下記に、C++ DLLを呼ぶC# EXEのソースコードを記載する。<br> <br> <source lang="c#"> // DllImportを使用するために必要 using System.Runtime.InteropServices; [DllImport("DrsUtil.dll", EntryPoint = "ConvertToShort")] extern static void _ConvertToShort(string pstr, IntPtr pret); //呼び出し元の名前変えちゃう public static short ConvertToShort(string str) { IntPtr buffer = new IntPtr(); buffer = Marshal.AllocHGlobal(2); // 2バイトのメモリ確保 _ConvertToShort(str, buffer); // C++/DLLの関数を呼ぶ short sval = Marshal.ReadInt16(buffer); // 変換 Marshal.FreeHGlobal(buffer); // メモリ開放 return sval; } </source> <br> IntPtr型の変数は様々なものが入るので、例えば、構造体を取得することも可能だが、C# EXEで構造体を定義しなければいけない。<br> WindowsのDLL(Win32 API)と.NET Frameworkでは型の管理方法が違うため、実際には型の相互変換(マーシャリング)が行われる。<br> 尚、BOOL型の実体はLONG型と同じなので、boolの代わりにintを指定することも可能である。<br> <br> <center>'''表1. Win32 APIでの型名と対応するC#の型'''</center> <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[]) || string (System.String)<br>System.Text.StringBuilder || |- | LPCSTR (const char *, const char[])<br>LPCWSTR (const wchar_t *, const wchar_t[]) || string (System.String) || |- | FLOAT (float) || float (System.Single) || |- | DOUBLE (double) || double (System.Double) || |} </center> <br><br> __FORCETOC__ [[カテゴリ:C_Sharp]]
ライブラリの基礎 - C++DLL
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse