我如何放置一个空指针(又名。void*或句柄)进入COM VARIANT-Type。包装类_variant_t不正确地将其转换为布尔值。但我需要把它作为指针放入,以便.NET的COM-Marshaller将其识别为IntPtr。
我读过的一个帖子是这位是MSDN Social的。他们提出了这样的解决方案:
VARIANTARG Arg;
VariantInit(&Arg);
V_VT(&Arg) = VT_INT;
V_INT(&Arg) = (int)m_hWnd; 这个解决方案的问题是,V_INT (成员intVal)是一个32位整数,并强制指针为32位指针。换句话说:我不能传输64位指针。这个问题有什么解决办法吗?还有其他方法将它作为64位整数进行传输吗?
我用一些代码测试过这个。因此,我使用一个.NET方法,它接收任何System.Object并输出它的值和类型。
public static void TakePtr(object ptr)
{
Console.WriteLine("Received a " + ptr.GetType() + " with value " + ptr);
}为了兼容,我的VARIANT是由v.llVal = 0; v.byref = myPointer;填充的,所以对于32/64位指针,应该总是正确地编译它。此外,我需要设置变体类型,这样.NET mapps就可以将其转换为System.IntPtr,而无需转换。(因为对于真正的程序集,我不能更改代码,也不想包装它。这将增加主要的复杂性。)。
System.IntPtr向后传输为VT_INT,它将mapps转发给System.Int32。VT_I8 System.Int64,而不是System.IntPtr。那么VARENUM标志将指定一个System.IntPtr
发布于 2012-05-29 14:07:55
目前,我找到了一个临时解决方案来解决整个问题:为了在调用方法时显式定义参数类型,我将使用另一种调用机制。因此,我使用以下方法,它几乎封装了类型调用方法的参数,但另外检查了类型并对它们进行相应的转换,这样就可以识别System.IntPtr,而不是System.Int32或System.Int64。
public static object InvokeMember(this Type type, object obj, String name, System.Reflection.BindingFlags invokeAttr, Type[] argTypes, object[] argValues)
{
if (argTypes.Length != argValues.Length) throw new InvalidOperationException("Mismatching count of types an parameters.");
for (int i = 0; i < argTypes.Length; i++) if (argTypes[i] == typeof(IntPtr)) argValues[i] = new IntPtr(Convert.ToInt64(argValues[i]));
return type.InvokeMember(name, invokeAttr, null, obj, argValues);
}此方法的调用可能如下所示:
typeof(ExampleLib.HelloNET).InvokeMember(
null,
"TakePtr",
BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod,
new Type[] { typeof(IntPtr) },
new object[] { 42 });最后,必须从COM中使用它传递指针变体,如所描述的那样填充指针变体:v.llVal = 0; v.byref = myPointer; v.vt = VT_INT;
/solved :-)
发布于 2012-05-27 17:48:48
这是不可能的,变体是一种自动化类型。自动化不喜欢处理指向未知类型的指针,因此没有安全的方法来解除它们的引用。唯一受支持的指针类型是IUnioking*和IDis修补程序*,它们是接口指针。
充其量,您可以将其存储为一个VT_I8,它将封送到一个long。然后,您可以将其转换为IntPtr。
发布于 2012-05-27 18:51:03
变体的PVOID byref;成员看起来很有用。但我不知道该配哪种类型的。
您可以像汉斯建议的那样使用LONGLONG llVal,因为即使32位平台也有IntPtr(Int64)构造函数。应该能工作直到有人发明128位指针。
https://stackoverflow.com/questions/10775953
复制相似问题