2013-01-15 11 views
11

Mam HWND w moim kodzie C++ MFC, i chcę przekazać ten HWND do kontrolki C# i uzyskać go jako IntPtr.Konwertuj HWND na IntPtr (CLI)

Co jest nie tak w moim kodzie i jak mogę to zrobić poprawnie? (Myślę, że jest to coś z niewłaściwym użyciem wskaźników CLI, ponieważ pojawia się błąd, którego nie można przekonwertować z System :: IntPtr^na System :: IntPtr. Ale nie wiem jak dokładnie to wszystko działa poprawnie ...) Kod

My C++ MFC:

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

Mój kod C#:

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

Mój kod 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); 
    } 

Błąd (nie można przekonwertować z IntPtr^do IntPtr) Obecnie występuje na m_pManagedData->CSharpControl->UpdateHandle(managedhWnd);

przypadku zmiany kodu CLI do:

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

Więc w tym przypadku wartość zdobyć w C# 0.

Jak mogę sprawić, aby działał poprawnie?

+0

może cię opublikować minimalny kod, aby odtworzyć błąd, a także określić, gdzie dokładnie wystąpił błąd? – stijn

Odpowiedz

20

Aby przekonwertować z HWND (który jest tylko wskaźnikiem) do IntPtr, wystarczy wywołać jego konstruktor i nie potrzebujesz gcnew, ponieważ jest to typ wartości. Tak to powinno działać, aby przekazać HWND z rodzimych udało:

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

I to jest funkcja można wywołać z kodu zarządzanego i uzyskać natywną HWND od w kodzie natywnym:

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