2013-01-23 169 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到位图”,你会得到很多结果。

相关问题