11

C++ MFC コードに HWND があり、この HWND を C# コントロールに渡し、IntPtr として取得したいと考えています。

コードのどこが間違っていますか?どうすれば正しく実行できますか? (System::IntPtr^ から System::IntPtr に変換できないというエラーが表示されるため、CLI ポインターの使用が間違っていると思います。しかし、すべてを適切に機能させる方法が正確にはわかりません。 ..)

私のC++ MFCコード:

HWND myHandle= this->GetSafeHwnd();
m_CLIDialog->UpdateHandle(myHandle);

私のC#コード:

public void UpdateHandle(IntPtr mHandle)
{
   ......
}

私のCLIコード:

void CLIDialog::UpdateHandle(HWND hWnd)
{
   System::IntPtr^ managedhWnd = gcnew System::IntPtr();
   HWND phWnd; // object on the native heap

   try
   {

       phWnd = (HWND)managedhWnd->ToPointer();
        *phWnd = *hWnd; //Deep-Copy the Native input object to Managed wrapper.

       m_pManagedData->CSharpControl->UpdateHandle(managedhWnd);
    }

エラー (IntPtr^ から IntPtr に変換できません) が現在発生していますm_pManagedData->CSharpControl->UpdateHandle(managedhWnd);

CLI コードを次のように変更した場合:

void CLIDialog::UpdateHandle(HWND hWnd)
{
   System::IntPtr managedhWnd;
   HWND phWnd; // object on the native heap

   try
   {

       phWnd = (HWND)managedhWnd.ToPointer();
        *phWnd = *hWnd; //Deep-Copy the Native input object to Managed wrapper.

       m_pManagedData->CSharpControl->UpdateHandle(managedhWnd);
    }

したがって、この場合、C# で取得される値は 0 です。

どうすれば適切に動作させることができますか?

4

1 に答える 1

21

HWND (単なるポインター) から IntPtr に変換するには、そのコンストラクターを呼び出すだけでよく、値型であるため gcnew は必要ありません。したがって、これは HWND をネイティブからマネージドに渡すために機能するはずです。

void CLIDialog::UpdateHandle( HWND hWnd )
{
  IntPtr managedHWND( hwnd );
  m_pManagedData->CSharpControl->UpdateHandle( managedHWND );
}

これは、マネージ コードから呼び出して、ネイティブ コードからネイティブ HWND を取得できる関数です。

void SomeManagedFunction( IntPtr hWnd )
{
  HWND nativeHWND = (HWND) hWnd.ToPointer();
  //...
}
于 2013-01-15T09:28:05.693 に答える