![](/img/trans.png)
[英]C++ & C#, how to create wrapper dll in C++ for C# to call instance function in C++ dll?
[英]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.