C++/CLIでC DLLのラッパーを作成して、C#で管理対象アセンブリを使用してアクセスできるようにしています。 P/Invoke(C/C#境界を越えて移動すると例外メッセージが失われる)を使用して正しく捕捉できない例外をC DLLが発生させるため、C#経由で直接P/Invokeを使用してC関数にアクセスすることはできません。そのため、内部的にC DLLを呼び出し、その例外をCLIのExceptionクラスにラップする、管理されたCLI DLLを作成することです。C#アクセス用のIntPtrを参照するためのC++/CLIダブルポインタ型キャスト
したがって、C DLL関数にはこの宣言があります。
void InitDB(void **handle);
C#のアプリはこれを実現するには次のように宣言
void InitDB_cs(ref IntPtr handle);
が必要だろう、私はしかし、私はにREF INPTRを型キャストすることができません宣言
void InitDB_clr(IntPtr %handle);
と次のようにC++/CLI関数を作成C関数。私は次のコードを使用してみましたが、型キャストの権利を得ることができないようです。
void InitDB_clr(IntPtr %handle)
{
pin_ptr<IntPtr> ptr = handle.ToPointer();
InitDB(&ptr);
}
上記のコードのエラーメッセージ
error C2440: 'initializing' : cannot convert from 'void *' to 'cli::pin_ptr<Type>'
1> with
1> [
1> Type=System::IntPtr
1> ]
1> Conversion from 'void*' to pointer to non-'void' requires an explicit cast
1>error C2664: 'InitDB' : cannot convert parameter 1 from 'cli::pin_ptr<Type> *' to 'void **'
1> with
1> [
1> Type=System::IntPtr
1> ]
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
誰が 'Init()'ですか? –
タイピングエラーです。 InitDB(C DLL関数)です。私の注意を喚起してくれてありがとう。 –
問題ありません。私はCLIを知らないが、何がエラーですか? '&ptr'を' void ** 'にキャストすると助けになりますか? –