gpt4 book ai didi

c# - 在 C# 中使用 C++ 组件对象模型

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:49 25 4
gpt4 key购买 nike

我正在尝试用 C++ 构建 COM 库,使用 C# 项目进行测试。有些方法需要将字符串返回给调用者。从 C# 调用这些方法时,我得到以下信息:“在位置读取访问冲突……”

这是我的测试项目中的 C++ 代码(除了 VS 2010 ATL 生成的所有内容)

//COMTest.idl
[id(1)] HRESULT Test([out,retval] BSTR* ret);

//Program2.h
STDMETHOD(Test)(BSTR* ret);

//Program2.cpp
STDMETHODIMP CProgram2::Test(BSTR* ret)
{
BSTR tmp = (BSTR)CoTaskMemAlloc(sizeof(wchar_t) * 2);
tmp[0] = L'H';
tmp[1] = L'\0';

*ret = (BSTR)tmp;
return S_OK;
}


在 C# 中,我只是从 COM-Tab 中引用 DLL,关闭“嵌入互操作类型”,因为它会导致错误,然后运行:

static void Main(string[] args)
{
COMTestLib.Program2Class instance = new COMTestLib.Program2Class();
string tmp = instance.Test(); //Where the error occurs

Console.WriteLine(tmp); //This is not reached

Console.Read();
}

错误发生在离开测试方法之后。我从我的 C# 项目中调试了 C++ 代码,并将值放置在正确的位置。如果我尝试返回 0(在 C# 中返回 null),我不会收到错误消息,即使我仍然像示例中那样分配内存。

我无法理解访问冲突所提示的地址。它既不是我正在分配的地址,也不是该方法中使用的任何其他地址。在我看来也很奇怪的是,CoTaskMemAlloc-Function 总是返回第一个字节设置为零 (0x00XXXXXX) 的地址,但这可能只是 COM 的问题。


我的想法用完了,而且我在任何地方都找不到这方面的很多信息(除了基本的 COM 教程)。谁能帮忙?

最佳答案

BSTR 需要额外的内存(以跟踪字符串 len),因此必须使用 SysAllocString () 函数分配 BSTR(或使用“智能”BSTR 类之一)。

所以你的原始代码应该是这样的:

//Program2.cpp
STDMETHODIMP CProgram2::Test(BSTR* ret)
{
*ret = SysAllocString(L"H");
return S_OK;
}

关于 BSTR 的好读物:http://blogs.msdn.com/b/ericlippert/archive/2003/09/12/52976.aspx

关于c# - 在 C# 中使用 C++ 组件对象模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12249007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com