4

C# で参照される .dll として最終的に使用するために、多数の .h および .lib ファイルをネイティブ C++ からマネージド C++ にラップする作業を行っています。

一部のネイティブ C++ 関数の戻り値の型は void* です。呼び出し元のコードに値を返すときにこれを処理する方法がわかりません。例: C# アプリが私の dll ラッパーを呼び出す場合、ネイティブ呼び出しから何を返しますか:

void* start(ThreadFunc,void *, unsigned *);

私は現在、一般的な System::Object^ でリターンをボックス化しようとしていますが、うまくいきません。これはラッパーでの呼び出しです。

m_NativeThread->start(cb, 
        GCHandle::ToIntPtr(GCHandle::Alloc(o)).ToPointer(),
        static_cast<unsigned int*>(GCHandle::ToIntPtr(GCHandle::Alloc(u)).ToPointer())));

誰でも解決策を提供できますか?

4

2 に答える 2

5

マネージド コードで void* 内のデータを参照する必要がある場合:

void* to unmanaged memory をマネージド オブジェクト参照にキャストすることはできません。これをマネージド メモリに変換するには、Marshal.Copy() または Marshal.PtrToStructure() を使用する必要があります。もちろん、これは void* が指すデータの型を知っている場合にのみ機能します。 ソース

マネージ コードが void* 内のデータを参照する必要がない場合:

マネージ コードがそれが何であるかを確認する必要がなく、後でアンマネージ コードに戻すだけの場合は、IntPtr に格納します。 ソース

于 2009-07-20T18:14:39.707 に答える
1

IntPtrにできますか?クライアントが void* に対して何をすることを期待していますか?

于 2009-07-20T18:04:27.623 に答える