如何将双指针从 C# 传递到 COM 并在 COM 中启动它
How to pass double pointer to COM from C# and initliaze it inside COM
>我已经创建了一个采用双指针(BYTE**)的COM方法。在 COM 中,我正在分配内存并初始化它。
签名是;
HRESULT Canny([in] BSTR szLogoPath, [out] BYTE** pBuffer, [out] USHORT* iBufLen);
问题是当我从 C# 项目调用它时 COM 崩溃,而当我从 WIN32 项目调用它时它工作正常。
此外,在 C# 项目中,上述方法显示为;(BYTE**显示为IntPtr)
public virtual void Canny(string szLogoPath,IntPtr pBuffer, out ushort iBufLen);
我的 C# 代码是
LogoFinderClass libCOM = new LogoFinderClass();
unsafe {
byte* buf = null;
IntPtr interopPtr = new IntPtr(&buf);
libCOM.Canny(@"..Logo.bmp", interopPtr, out bufLen);
}
在C++中,我将记忆分配为;
::Canny(BSTR szLogoPath, BYTE** pBuffer, USHORT* iBufLen) {
*pBuffer = new BYTE[1024];
..
}
从 C# 调用时,COM 在分配内存时崩溃。
这里
不需要unsafe
。确实需要在 C# 端更改函数的声明。缓冲区参数需要声明为:
ref IntPtr pBuffer
然后,调用函数后,使用 Marshal.Copy
读出缓冲区的内容。
我不是从 C# 使用 COM 的导出,但第一个参数不应该[MarshalAs(UnmanagedType.BStr)]
吗?
此外,如果您使用 CoTaskMemAlloc
而不是 new
,您可以让调用方释放缓冲区,而不必导出释放器。我相信您确实导出了交易分配器?
相关文章:
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 在函数内部的声明中初始化数组,并在外部使用它
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 定义C++新的环境变量并在 bat 文件中使用它
- Visual Studio 2017 停止工作,并在打开后显示许多控制台窗口
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 将通用对象传递给 Rust 并在使用后传递回 C++ 进行销毁
- 动态获取 esp32 的 mac 地址并在以太网库中使用它.
- 从.txt文件中读取浮点型数字并在公式中使用它们
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 在C++的头文件中使用常量并在程序中询问其地址的任何潜在危险
- C++ 和 Boost.Python - 如何将变量公开给 python 并在循环中更新它?
- 如何在组合框中列出所有可用的 VCL 样式,并在组合框更改事件中应用该样式C++生成器?
- 2 个 COM 对象,并在另一个对象中使用其中一个对象的接口
- 如何将双指针从 C# 传递到 COM 并在 COM 中启动它