C# 更干净的编码方式,而不是Marshall.QueryInterface?

C# 更干净的编码方式,而不是Marshall.QueryInterface?,c#,.net,pinvoke,C#,.net,Pinvoke,我想知道是否有更干净的方法来编写下面的工作代码: 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

我想知道是否有更干净的方法来编写下面的工作代码:

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**时,即当我使用oleview的初始idl输出调用PStore.EnumTypes时,tlbimp输出的dll告诉我传入对CEnumTypes的引用。函数对此表示满意,它返回S_OK,但没有填充引用。当我将它改为接受一个指向long的指针时,就会出现这种糟糕的代码,这也是我为了让CEnumTypes实例引用指针所做的。这整件事让我觉得有点凌乱,尽管它确实有效。有没有更干净的方法


请注意,行PSTORECLib.CEnumTypes cen=新的PSTORECLib.CEnumTypes;将抛出一个未注册的类COMException。

哎哟,你在用低级方式攻击COM。大致上还可以,但也有问题。它永远不会在64位模式下工作,Unum不能是uint,它必须是指针。它也被泄露了,你不能要求发布。你不能忽视这一点


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

哎哟,你在用低级的方式攻击COM。大致上还可以,但也有问题。它永远不会在64位模式下工作,Unum不能是uint,它必须是指针。它也被泄露了,你不能要求发布。你不能忽视这一点


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

我开始编辑我的帖子以提供Hans Passant要求的信息,然后我顿悟并解决了问题。出于某种原因,以前从事此项目的人员创建的typelibrary的旧版本和我的版本都存在类似的问题,可能是因为我们都对oleview的信任度超过了我们应有的程度


特别是,其中一个参数是[In]参数,而不是[out]参数。VB6不关心,但C非常关心。

我开始编辑我的帖子,提供汉斯·帕桑要求的信息,然后我顿悟并解决了问题。出于某种原因,以前从事此项目的人员创建的typelibrary的旧版本和我的版本都存在类似的问题,可能是因为我们都对oleview的信任度超过了我们应有的程度


特别是,其中一个参数是[In]参数,而不是[out]参数。VB6不关心,但C非常关心。

是的,我提到的out参数就是在这里丢失的。我不知道这是什么意思。我在回复你的编辑,说我忽略了out属性。我自己的回答提到了这个问题,使用了不正确的术语,这表明我比你的回答早一点理解了这个问题,但没有那么详细,所以我确认你对这个问题的理解是正确的。是的,这就是我提到的out参数丢失的地方。我不知道这意味着什么。我是在回应你关于我省略out属性的编辑。我自己的回答提到了这个问题,使用了不正确的术语,这表明我比你的回答早一点理解了这个问题,但没有那么详细,所以我确认你对这个问题的理解是正确的。