2013-01-15 6 views
11

Ho un HWND nel mio codice MFC C++ e voglio passare questo HWND a un controllo C# e ottenerlo come IntPtr.Conversione da HWND a IntPtr (CLI)

Cosa c'è di sbagliato nel mio codice e come posso farlo correttamente? (Penso che sia qualcosa con l'uso errato dei puntatori CLI, perché ottengo un errore che non può convertire da System :: IntPtr^a System :: IntPtr. Ma non so esattamente come far funzionare tutto correttamente ...) codice

mio C++ MFC:

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

Il mio codice C#:

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

Il mio codice 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); 
    } 

errore (non può convertire da IntPtr^a IntPtr) attualmente si verifica su m_pManagedData->CSharpControl->UpdateHandle(managedhWnd);

se cambio il codice CLI per:

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

Quindi, in questo caso il valore ottenuto in C# è 0.

Come posso farlo funzionare correttamente?

+0

si può inserisci il codice minimo per riprodurre l'errore, oltre a indicare dove si verifica esattamente l'errore? – stijn

risposta

20

Per convertire da HWND (che è solo un puntatore) a IntPtr, è sufficiente richiamare il suo costruttore e non è necessario gcnew in quanto è un tipo di valore. Quindi questo dovrebbe funzionare per passare un HWND da nativo gestito:

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

E questa è una funzione è possibile richiamare dal codice gestito e ottenere un HWND nativo in codice nativo:

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