2013-01-15 15 views
11

C++ MFC kodumda bir HWND var ve bu HWND'yi bir C# denetimine iletmek ve IntPtr olarak almak istiyorum.HWND'yi IntPtr (CLI) dönüştürün

Kodumda yanlış olan nedir ve nasıl doğru yapabilirim? (Ben CLI işaretçisini yanlış kullanarak bir şey düşünüyorum, çünkü System :: IntPtr^System :: IntPtr dönüştürebilirsiniz bir hata alıyorum. Ama tam olarak düzgün çalışması için tam olarak nasıl bilmiyorum ...)

Benim C++ MFC kodu:

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

Benim C# kodu:

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

Benim CLI kodu:

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

Hata ben CLI kodunu değiştirmek durumunda şu anda m_pManagedData->CSharpControl->UpdateHandle(managedhWnd);

olur (IntPtr^IntPtr dönüştürmek olamaz):

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

Yani bu durumda C# kazanılmış değer 0.

olduğunu

Düzgün çalışmasını nasıl sağlayabilirim?

+0

can hatayı çoğaltmak için yanı sıra hatanın tam olarak nerede meydana geldiğini söylemek için en az kod göndermek? – stijn

cevap

20

HWND'den (sadece bir işaretçi) IntPtr'e dönüştürmek için, yalnızca yapıcısını çağırmanız gerekir ve bir değer türü olarak gcnew'e ihtiyacınız yoktur. Yani bu yönetilen özgü bir HWND geçmek çalışması gerekir:

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

Ve bu Yönetilen koddan çağırmak ve yerel kodda bir yerli HWND alabilirsiniz bir işlevdir: Teşekkür

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