如何为 c++ 函数创建 c# 包装器
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);
我设法为"连接","断开连接","已连接"写作
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",你就会得到很多结果。
相关文章:
- 创建包装升压适配器的自定义范围类
- 如何为 v8::P ersistent<v8::Function> 创建到 c++ 函数的包装器
- 包装器是从 strcat_s() 到 strcat() 吗?如果没有,是否可以创建一个?
- 如何为要在 C# 中使用的静态库创建 C++ 或 C++/CLI 包装器
- 如何创建独立于平台的宏来包装编译器扩展?
- 在 C++ 中为 C 样式对象创建一个透明包装类
- 创建一个允许轻松创建虚拟函数包装器函数的C++宏
- 为 std::bind 创建模板包装器
- 如何在 C 中创建用于使用 C++ 代码的包装器?
- 创建一个__cdecl以在 C++ 上__thiscall包装函数
- 从对象创建矢量包装器,该对象只允许使用索引访问向量
- 从Boost Python包装工厂创建一个派生的类
- 在 boost::d eadline_timer 上创建包装器,无法将参数传递给处理程序函数
- 包装本征的张量类以创建动态秩张量?
- 创建包装了可变类型的元组
- 为对象创建"thin"结构包装器的正确方法是什么?
- 使用本机C 包装器作为NCurses,如何创建菜单/子菜单系统
- C++ - 错误:为 OpenCV 的 cv::标量::all 创建 C 包装器时出现预期的类型说明符
- 如何创建一个同时适用于多种语言的包装器
- 简化包装创建