簡體   English   中英

如何為C ++函數創建ac#包裝器?

[英]How to create a c# wrapper for c++ function?

你好,標題說我需要創建一個包裝器才能在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轉換為Bitmap。 我這樣嘗試過:

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

但是沒有運氣

謝謝,

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM