2013-01-15 15 views
11

मेरे सी ++ एमएफसी कोड में एक HWND है, और मैं इस HWND को सी # नियंत्रण में पास करना चाहता हूं और इसे IntPtr के रूप में प्राप्त करना चाहता हूं।HWND से IntPtr (CLI)

मेरे कोड में क्या गलत है, और मैं इसे सही तरीके से कैसे कर सकता हूं? (मुझे लगता है कि यह सीएलआई पॉइंटर्स का उपयोग करके गलत है, क्योंकि मुझे एक त्रुटि मिलती है कि यह सिस्टम :: IntPtr^से सिस्टम :: 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); 
    } 

त्रुटि वर्तमान में अगर मैं करने के लिए CLI कोड बदलने m_pManagedData->CSharpControl->UpdateHandle(managedhWnd);

पर होता है (IntPtr IntPtr करने के लिए^से परिवर्तित नहीं कर सकते):

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.

है

मैं इसे ठीक से कैसे काम कर सकता हूं?

+0

कर सकते हैं आप त्रुटि को पुन: उत्पन्न करने के लिए न्यूनतम कोड पोस्ट करें, साथ ही यह बताएं कि त्रुटि वास्तव में कहां होती है? – stijn

उत्तर

20

इंटप्राट में एचडब्ल्यूएनडी (जो सिर्फ एक सूचक है) से कनवर्ट करने के लिए आपको बस इसे कन्स्ट्रक्टर का आह्वान करना होगा, और आपको जीसीएनयू की आवश्यकता नहीं है क्योंकि यह एक मूल्य प्रकार है। तो यह कामयाब करने के लिए मूल से एक HWND पारित करने के लिए काम करना चाहिए:

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

और यह एक समारोह आप प्रबंधित कोड से आह्वान और मूल कोड में से एक देशी HWND प्राप्त कर सकते है:

void SomeManagedFunction(IntPtr hWnd) 
{ 
    HWND nativeHWND = (HWND) hWnd.ToPointer(); 
    //... 
} 
संबंधित मुद्दे