2013-01-15 34 views
11

Tôi có HWND trong mã C + + MFC, và tôi muốn chuyển HWND này cho điều khiển C# và lấy nó làm IntPtr.Chuyển đổi HWND thành IntPtr (CLI)

Điều gì sai trong mã của tôi và làm cách nào để tôi có thể thực hiện chính xác? (Tôi nghĩ rằng đó là một cái gì đó sai với việc sử dụng các con trỏ CLI, vì tôi nhận được một lỗi rằng nó không thể chuyển đổi từ System :: IntPtr^sang System :: IntPtr. Nhưng tôi không biết chính xác làm thế nào để làm cho nó hoạt động đúng cách ...) mã

My C++ MFC:

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

My C# code:

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

đang CLI của tôi:

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

Lỗi (không thể chuyển đổi từ IntPtr^để IntPtr) hiện xảy ra trên m_pManagedData->CSharpControl->UpdateHandle(managedhWnd);

nếu tôi thay đổi mã 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); 
    } 

Vì vậy, trong trường hợp này, giá trị nhận được trong C# là 0.

Tôi làm cách nào để hoạt động chính xác?

+0

thể bạn đăng mã tối thiểu để tạo lại lỗi, cũng như cho biết lỗi xảy ra chính xác ở đâu? – stijn

Trả lời

20

Để chuyển đổi từ HWND (chỉ là một con trỏ) thành IntPtr, bạn chỉ cần gọi hàm khởi tạo của nó, và bạn không cần gcnew vì nó là một kiểu giá trị. Vì vậy, điều này sẽ làm việc để vượt qua một HWND từ nguồn gốc từ quản lý:

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

Và đây là một chức năng bạn có thể gọi từ mã được quản lý và có được một HWND có nguồn gốc từ trong mã nguồn gốc:

void SomeManagedFunction(IntPtr hWnd) 
{ 
    HWND nativeHWND = (HWND) hWnd.ToPointer(); 
    //... 
} 
Các vấn đề liên quan