【解決方法】COM を使用した C# WPF と C++ MFC 間のメモリ管理

プログラミングQA


C# WPF ユーザー コントロール DLL があります。
このユーザー コントロールを C++ MFC UI 上に表示したいと考えています。
それらの間の通信には、C++ COM DLL (この VS プロジェクトでは CLR が有効になっています) を使用しています。

IDL ファイルには、次のような COM 関数のエントリがあります。

ミドル
[local] HRESULT getUserControlComponent([in] int userControlKey, [out, retval] void* userControlObj);

C++ 側では、この関数を次のように呼び出しています。

C++
int key = 1;
void* myUserControlInCPP;
myCPP_and_CSharpCOMObj->getUserControlComponent(key, myUserControlInCPP);

この関数「getUserControlComponent」は別の C# メソッド「createUserControl_Instance」を呼び出し、最終的に次のように C# ユーザー コントロールの CTOR を呼び出します。

C#
gcroot<MyCoolUserControlNamespace::DummyUserControl^> userControlDummy = gcnew MyCoolUserControlNamespace::DummyUserControl(); //This is the call to the CTOR.

ここで、「userControlDummy」には NULL 以外の値が含まれています。

しかし、このコードの制御が C++ 側に返されると、オブジェクト ‘myUserControlInCPP’ は NULL 値を持ちます。

C++ 側のユーザー コントロールで NULL 値が取得されるのはなぜですか。誰かが私を助けてくれますか?

私が試したこと:

インターネットのどこかで、そのような状況に対処するときは次のようにする必要があることを見つけました。
C# 側のコード:

C#
HRESULT getUserControlComponent(key, myUserControlInCPP)
{
    System::Object^ tempUserControlObj = createUserControl_Instance(key); //This function calls the CTOR of User Control.

    myUserControlInCPP = (GCHandle::ToIntPtr(GCHandle::Alloc(tempUserControlObj))).ToPointer();
	

}

ただし、これにより、C# 側では非 NULL 値が生成されますが、C++ 側では NULL ポインターが生成されます。

解決策 1

を入れる必要があると思います C# メソッド自体に適用するため、コンパイラは変更された値を呼び出し元に返すことができます。 なしで の場合、パラメーター変数への変更はメソッド内でのみ表示されます。

コメント

タイトルとURLをコピーしました