如何将双指针从 C# 传递到 COM 并在 COM 中启动它

How to pass double pointer to COM from C# and initliaze it inside COM

本文关键字:COM 并在 启动 指针      更新时间:2023-10-16

>我已经创建了一个采用双指针(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,您可以让调用方释放缓冲区,而不必导出释放器。我相信您确实导出了交易分配器?