【問題点】
現在C#で開発を行っており、C++で作られたDLL(他社製)をC#側で呼び出そうとしています。
しかしうまく呼び出しができずに困っております。
当方、C++はポインタの概念がうっすら理解している程度です。
どなたかご教授頂けますと幸いです。
【現状】
下記ソースで用いているDLLを仕様書で確認すると下記のようになっております。
(関数名は適宜変更しております)
int WINAPI Init(P_HANDLE *handle);
int WINAPI Do(P_HANDLE handle);
int WINAPI Free(P_HANDLE *handle);
またP_HANDLEについてですが、DLLの定義があるヘッダファイルを確認すると
下記の記述がありました。よってP_HANDLEはvoidだと考えました。
typedef void P_HANDLE;
【ソース】
下記に実装したDLLインポート、実装クラス、ならびにベンダーから提供された
サンプルコードの一部を記載します。
〇C# DLLのインポート
[DllImport("sample.dll", EntryPoint = "Init", CharSet = CharSet.Unicode)] public static extern int Init(IntPtr handle); [DllImport("sample.dll", EntryPoint = "Do", CharSet = CharSet.Unicode)] public static extern int Do(IntPtr handle); [DllImport("sample.dll", EntryPoint = "Free", CharSet = CharSet.Unicode)] public static extern int Free(IntPtr handle);
〇C# 実装クラス
IntPtr ptr = new IntPtr(); ptr = Marshal.AllocHGlobal(1024); //どれだけ確保すればよいかわからなかったので適当です int ret //初期化 //ここの処理は正常のコードが返ってくる ret = Init(ptr); //処理実行 //ここの処理では初期化失敗のエラーコードが返ってくる ret = Do(ptr); //メモリ解放 ret = Free(ptr);
〇C++ サンプルコード
int ret = 0; P_HANDLE handle = 0; //初期化 ret = Init(&handle); if(ret!=0){(例外処理)} //処理実行 ret = Do(handle); if(ret!=0){(例外処理)} //メモリ解放 ret = Free(&handle);
【試したこと・考えたこと】
・typedefでvoid*としているのでC#ではintPtrを使うと思われる。
・実装クラスのptrで、参照型を試すため、DLLインポート文でInitとFree関数の引数に
ref,outを入れて試しましたがだめでした。
・インポート文の引数の記述、IntPtrの使い方の2点が怪しいのですが、
解決に至りませんでした。
【開発環境】
・OS,IDE:win10, visual studio 2015 pro
・言語:.NET(C#)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/27 04:13
2018/02/27 05:06
2018/02/27 05:08
2018/02/27 05:22
2018/02/27 05:41
2018/03/02 08:32