2011-07-24 5 views
2

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 
+0

誰が 'Init()'ですか? –

+0

タイピングエラーです。 InitDB(C DLL関数)です。私の注意を喚起してくれてありがとう。 –

+0

問題ありません。私はCLIを知らないが、何がエラーですか? '&ptr'を' void ** 'にキャストすると助けになりますか? –

答えて

1

を使用することができますか?

それはイン/アウトする必要がある場合

void InitDB_clr(IntPtr% handle) 
{ 
    void* ptr /* = handle.ToPointer() */; 
    InitDB(&ptr); 
    handle = IntPtr(ptr); 
} 

コメントを解除初期化子を試してみてください。

+0

上記のコードでは、C++/CLIプロジェクトでコンパイルすると次のエラーが発生します。:エラーC2440: '=': 'System :: IntPtr ^'を 'System :: IntPtr'に変換できません。 –

+0

@ 'gcnew'を使用します。ところで、これは既に[あなたが同じ質問をした] MSDNフォーラムで回答されています(http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/fdb13eb5-f6bd-4710-aadd -ebc898992bf9)。 – ildjarn

+0

@ildjarn:ありがとう。私はstackoverflowとMSDNフォーラムの両方に投稿しました。あなたの助けに感謝して、それは今働いています:) –

0

あなたは危険な状況でのC#を使用して、正しいoutパラメータではなく、本当にref、だ

unsafe void InitDB_cs(IntPtr** handle); 
+0

私はC#でポインタ/安全でないコードを持ちたくないです。これは、C++のすべての機能を持ち、内部的にC DLLと対話するC++/CLIを管理するための理由の1つです。 –

関連する問題