如何为 c++ 函数创建 c# 包装器

How to create a c# wrapper for c++ function?

本文关键字:包装 创建 函数 c++      更新时间:2023-10-16

你好,因为标题说我需要创建一个包装器才能在 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);

我设法为"连接","断开连接","已连接"写作

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

但没有运气

谢谢

C

代码看起来像 MIDL 编译器生成的 COM 接口的一部分,因此你可以直接从 C# 使用它,而无需任何包装器(只需添加对 COM 组件的引用)。但是,如果您选择使用 C++/CLI 包装器,请引发异常而不是返回 HRESULT。

至于你的GetImagePreview方法,你只完成了一半的工作(你甚至没有返回任何位图对象)。只需谷歌搜索"HBITMAP to Bitmap",你就会得到很多结果。