Преобразование HWND в IntPtr (CLI)

У меня есть HWND в моем коде MFC CFC, и я хочу передать этот HWND на элемент управления С# и получить его как IntPtr.

Что не так в моем коде, и как я могу сделать это правильно? (Я думаю, что-то с неправильным использованием указателей CLI, потому что я получаю сообщение об ошибке, которое он не может преобразовать из System:: IntPtr ^ в System:: IntPtr. Но я не знаю, как именно заставить все работать правильно...)

Мой код С++ MFC:

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

Мой код С#:

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);
    }

Итак, в этом случае значение, полученное в С#, равно 0.

Как я могу заставить его работать правильно?

Ответ 1

Чтобы преобразовать из HWND (который является только указателем) в IntPtr, вам просто нужно вызвать его конструктор, и вам не нужен gcnew, как тип значения. Таким образом, это должно работать, чтобы передать HWND из native в управляемый:

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

И это функция, которую вы можете вызывать из управляемого кода и получить собственный HWND из собственного кода:

void SomeManagedFunction( IntPtr hWnd )
{
  HWND nativeHWND = (HWND) hWnd.ToPointer();
  //...
}