2008-08-25 12 views
1

マネージvoid型のrefクラス*):ポインタ**私は空をとる関数で古いCライブラリを持つC++

エラーC2440: 'static_castを':CONVERすることはできません

oldFunction(static_cast<sqlite3**>( &m_pStuff)); 

これは私のVisual Studioから次のエラーを与えます'cli :: interior_ptr'から 'void **'へ

私は、コンパイラがvoid *メンバーポインタを背中の背後の背後に変換していると推測しています。

これを行う方法に関するアドバイスはありますか?

答えて

1

EDIT:下記を参照してください。

本当にあなたは、oldFunctionがpStuffで何をしているのかを知る必要があります。 pStuffは、いくつかの管理対象外のデータへのポインタである場合は、とm_pStuffの定義を包む試すことができます。

#pragma unmanaged 

void* m_pStuff 

#pragma managed 

これは、アンマネージ関数に渡すことができるポインタ非管理を行います。もちろん、このポインタにマネージオブジェクトを直接割り当てることはできません。

基本的に管理されていない管理されたポインタは同じではなく、基になるデータをコピーする何らかのグルーコードなしでは変換できません。基本的に管理されたポインタは管理されたヒープを指しています。そして、これはガベージコレクションされているので、それらが指す実際のメモリアドレスは時間とともに変化します。アンマネージポインタは、明示的にそうしなければメモリアドレスを変更しません。

クラス定義内でアンマネージ/管理を定義することはできません。しかし、このテストコードがうまく動作するようです:ここで

// TestSol.cpp : main project file. 

#include "stdafx.h" 

using namespace System; 

#pragma unmanaged 

void oldFunction(void** pStuff) 
{ 
    return; 
} 

#pragma managed 

ref class Test 
{ 
public: 
    void* m_test; 

}; 

int main(array<System::String ^> ^args) 
{ 
    Console::WriteLine(L"Hello World"); 

    Test^ test = gcnew Test(); 
    void* pStuff = test->m_test; 
    oldFunction(&pStuff); 
    test->m_test = pStuff; 

    return 0; 
} 

私は、最初の管理対象オブジェクトの外にポインタをコピーしてoldFunctionにすることによって、その中を通過します。次に、結果(おそらくoldFunctionによって更新された)を管理対象オブジェクトにコピーします。マネージオブジェクトは管理されたヒープ上にあるため、ガベージコレクタの実行時に移動する可能性があるため、コンパイラはそのオブジェクトに含まれるポインタへの参照を渡すことはできません。

0

アドバイスをいただきありがとうございます。ポインタは、管理されたコードに公開された構造を残すと、定義された構造が不足しているためにさらに苦しむ原因になると思います。だから私がやることは、CライブラリをC++でラップし、C++ラッパーにマネージC++をラップすることです。そうすることで、これらのC構造がマネージコードに公開されなくなります。

関連する問題