2013-01-23 70 views
0

你好,因爲標題說我需要創建一個包裝,以使用它從我的C#代碼C.但事實是,我沒有C的知識,但我更好的C#。如何爲C++函數創建一個c#包裝器?

Ç

HRESULT (STDMETHODCALLTYPE *Connect)( 
     ExCtrl * This, 
     /* [in] */ EX_CONNECT *pConnect); 

    HRESULT (STDMETHODCALLTYPE *Disconnect)( 
     ExCtrl * This); 

    HRESULT (STDMETHODCALLTYPE *IsConnected)( 
     ExCtrl * This); 

    HRESULT (STDMETHODCALLTYPE *GetStatus)( 
     ExCtrl * This, 
     /* [out] */ ExStatus **ppStatus); 
HRESULT (STDMETHODCALLTYPE *GetPreview)( 
     ExCtrl * This, 
     /* [out] */ HBITMAP *phbm); 

我設法寫的 「連接」, 「斷開」, 「IsConnected」

C++

HRESULT Connect(String^ ServerIP) 
{ 
    IntPtr ptr = Runtime::InteropServices::Marshal::StringToBSTR(ServerIP);// 
    CComBSTR bstr;                     //Converting ip string 
    bstr.Attach(static_cast<BSTR>(ptr.ToPointer()));  



    if (IsConnected()) 
     return E_UNEXPECTED;  // already connected 

    ExCtrl *piCtrl = NULL; 
    HRESULT hr = Ex_CreateController(__uuidof(ExCtrl), __uuidof(ExCtrl), (void **)&piCtrl); 
    if (FAILED(hr)) return hr; 

    EX_CONNECT connection = {0};     // Connection data 

    connection.appType = APP_TYPE;      
    connection.bstrPrimaryName=CComBSTR(bstr);    // 
    connection.layerId = (int)LAYER0 + m_iLayerNum; 
    connection.masterServer = SERVER_PRIMARY; 
    TIME_ZONE_INFORMATION tz; 
    connection.pTz = &tz; 

    hr = piCtrl->Connect(&connection); 
    if (FAILED(hr)) { 
     piCtrl->Release();  // connection failed - clear the controller 
    } else 
     m_piCtrl = piCtrl; // succefully connected 

    return hr; 
} 


bool IsConnected() 
{ 
    return (m_piCtrl != NULL); 
} 

HRESULT Disconnect() 
{ 
    if (!IsConnected()) 
     return E_UNEXPECTED;  // not connected 

    HRESULT hr = m_piCtrl->Disconnect(); 
    if (SUCCEEDED(hr)) m_piCtrl->Release(); 
    m_piCtrl = NULL; 
    return hr; 
} 

的問題是 「GetPreview」 我不知道如何將HBitmap轉換爲位圖。我想是這樣的:

HRESULT GetImagePreview(BITMAP bm) 
{ 
    HBITMAP hB =NULL; 

    tExCtrl *piCtrl = NULL; 
    HRESULT hr = Ex_CreateController(__uuidof(ExCtrl), __uuidof(ExCtrl), (void **)&piCtrl); 


hr = piCtrl->GetPreview(&hB); 
hr = GetObject(hB, sizeof(BITMAP), &bm); 
return hr; 
} 

但沒有運氣

感謝,

+1

看看P/Invoke,我建議不要使用C++/CLI進行包裝,即使它有時候是一個「更好看」的解決方案。 – antonijn

+0

@AntonieBlom這太糟糕了...... – user1610015

+0

@ user1610015怎麼樣?使用C++/CLI,您將立即失去所有**跨平臺兼容性(這種情況下不存在,但通常情況下不存在),並且您需要使用另一種語言將語言1轉換爲語言3。所以解決方法 - 對我來說。 – antonijn

回答

0

C代碼看起來像由MIDL編譯器生成一個COM接口的一部分,所以你也許可以從C#直接使用它沒有任何包裝器(只需添加對COM組件的引用)。但是,如果您選擇使用C++/CLI包裝器,則會拋出異常而不返回HRESULT。

至於你的GetImagePreview方法,你只能完成一半的工作(你甚至不會返回任何Bitmap對象)。只需谷歌的「HBITMAP到位圖」,你會得到很多結果。