gpt4 book ai didi

.net - 如何使用 COM 在 .NET 和 C++ 之间传递结构?

转载 作者:行者123 更新时间:2023-12-01 17:35:10 24 4
gpt4 key购买 nike

我正在使用以下方法在我的 C++ 程序中托管一个 .NET 库,但不是一个详尽的列表:

CorBindToRuntimeEx()
GetDefaultDomain()
CreateInstance()
GetIDsOfNames()

最后调用 Invoke() .

这适用于基本类型、枚举、字符串和数组。但是,我无法弄清楚如何传递结构。这是我现在拥有的骨架:
//library.cs  
public class AStruct
{
public int i1;
public string s1;
public double d1;
}

//...
public AStruct getAStruct();

//interop.cpp
HRESULT hr = assembly->Invoke (id_getAStruct, ...);
OUT PARAM该函数的返回值为 VARIANT类型为 VT_DISPATCH .

当我查看 retVal.pdispVal在我的调试器中,我可以看到我的结构的内容不在那个地址附近。我想使用 varIDis.pdispVal->QueryInterface()访问我的结构,但我不知道 IID 是什么是,也不知道如何发现它。

此外,我没有 .NET 库的源代码,尽管我可以通过 Reflector 看到其中的大部分内容。我正在使用我在 .NET 中编写的测试库来弄清楚如何继续。

那么,如何使用 COM 在 .NET 和 C++ 之间传递和接收结构?

非常感谢。

最佳答案

我认为您的问题与结构无关。事实上,这里没有涉及到结构——在 C#、C++ 和 COM 中都没有。 getAStruct 方法(某些未指定的类?)返回指向 AStruct 类实例上的 IDispatch 接口(interface)的指针。

你没有足够的硬信息来正确地做事,所以这就是我的处理方式......(很多猜测......)

忘记结构。你被 IDispatch* 困住了。如果您知道 AStruct 类的完整定义,或者至少知道其属性的完整列表和定义它们的顺序,那么就从这个假设开始:第一个属性的 DISPID 是 0x6002000。接下来是 0x6002001,以此类推。当然,这不能保证,但你可能很幸运。而且我忘记了导致 DISPID 从 0x60020000 开始的条件,所以它可能是完全错误的。另外,我认为不能保证属性的 DISPID 与源代码中的定义顺序相同。

轻快地移动,在您拥有的 IDispatch* 上调用 IDispatch::Invoke,传递猜测的 DISPID 和 wFlags=DISPATCH_PROPERTYGET/PUT。

就像我说的,很多猜测。但如果我的背靠墙,这就是我要开始的地方。

关于.net - 如何使用 COM 在 .NET 和 C++ 之间传递结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5225158/

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