如何为c+创建c#包装器+;功能?

如何为c+创建c#包装器+;功能?,c#,c++,c,C#,C++,C,您好,正如标题所说,我需要创建一个包装器,以便在我的c代码中使用它。但事实是,我不懂c,但我比c好得多 C 我设法写了“连接”、“断开连接”、“断开连接” C++ 但是没有运气 谢谢,C代码看起来像是MIDL编译器生成的COM接口的一部分,因此您可以直接从C使用它,而无需任何包装(只需添加对COM组件的引用)。但是,如果选择使用C++/CLI包装器,则抛出异常而不是返回HRESULT 至于GetImagePreview方法,您只完成了一半的工作(甚至没有返回任何位图对象)。只要在谷歌上搜索“HB

您好,正如标题所说,我需要创建一个包装器,以便在我的c代码中使用它。但事实是,我不懂c,但我比c好得多

C

我设法写了“连接”、“断开连接”、“断开连接”

C++

但是没有运气


谢谢,

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


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

看看p/Invoke,我建议不要在包装器上使用C++/CLI,即使它有时是一个“外观更好”的解决方案。@AntonieBlom,那更糟…@user1610015怎么办?使用C++/CLI,您会立即失去所有跨平台兼容性(本例中不存在这种兼容性,但通常情况下),并且需要使用另一种语言3从语言1转换为语言2。对我来说,这一切似乎都是权宜之计。
    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);
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;
}
    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;
}