gpt4 book ai didi

c# - 比 Marshall.QueryInterface 更简洁的编码方式?

转载 作者:太空宇宙 更新时间:2023-11-03 22:19:15 33 4
gpt4 key购买 nike

我想知道是否有更简洁的方法来编写下面的(工作)代码:

uint uEnum = 0;
PStore.EnumTypes(0, 0, ref uEnum);
System.Reflection.MemberInfo inf = typeof(PSTORECLib.CEnumTypes);
GuidAttribute CEnumGuid =
(GuidAttribute)inf.GetCustomAttributes(typeof(GuidAttribute), false)[0];
Guid tmp = new Guid(CEnumGuid.Value);
IntPtr ppv;
Marshal.QueryInterface((IntPtr)uEnum, ref tmp, out ppv);
PSTORECLib.CEnumTypes EnumPStoreTypes =
(PSTORECLib.CEnumTypes)Marshal.GetObjectForIUnknown(ppv);

//Later
Marshal.Release(ppv);

当我尝试将 PSTORECLib 的 idl 文件中的 IEnumPStoreTypes** 填充到对 PStore.EnumTypes 的调用中时(即当我使用 oleview 的初始 IDL 输出时) ,tlbimp 输出的 dll 告诉我传递对 CEnumTypes 的引用。该函数对此很满意(它返回 S_OK),但它没有填充引用。当我将它更改为接受指向 long 的指针时,就会发生这种乱七八糟的丑陋代码,这也是我为获取 CEnumTypes 的实例以引用该指针所做的。这整件事让我觉得有点困惑,尽管它确实有效。有没有更简洁的方法来做到这一点?

请注意 PSTORECLib.CEnumTypes cen = new PSTORECLib.CEnumTypes(); 行将抛出“类未注册”COMException。

最佳答案

哎呀,您正在以低级方式破解 COM。大体上没问题,但是有问题。它永远不会在 64 位模式下工作,uEnum 不能是一个 uint,它必须是一个指针。它也被泄露了,你不为它调用 Release()。你不能忽视这一点。

很明显,您已经有了一个类型库并从中创建了一个互操作库,否则反射代码将无法工作。我只能猜测 IDL 有问题。 EnumTypes 的签名表明您忘记了最后一个参数的 [out,retval] 属性。至少发布 EnumTypes 的 IDL。

关于c# - 比 Marshall.QueryInterface 更简洁的编码方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3814846/

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