Com 如何在IDL中声明void*类型的参数

Com 如何在IDL中声明void*类型的参数,com,atl,void-pointers,idl,Com,Atl,Void Pointers,Idl,我正在开发ATL项目。某些接口包含传递各种指针的参数。这是我的IDL文件: import "oaidl.idl"; import "ocidl.idl"; [ object, uuid(618E64F5-676B-4A13-A513-DE3D4097294A), dual, nonextensible, helpstring("IMyObject Interface"), pointer_default(unique) ] interface IM

我正在开发ATL项目。某些接口包含传递各种指针的参数。这是我的IDL文件:

import "oaidl.idl";
import "ocidl.idl";
[
    object,
    uuid(618E64F5-676B-4A13-A513-DE3D4097294A),
    dual,
    nonextensible,
    helpstring("IMyObject Interface"),
    pointer_default(unique)
]
interface IMyObject : IDispatch{
    [id(1), helpstring("method Make")] HRESULT Make(DWORD type, LPVOID settings);
    [id(2), helpstring("method Deserialize")] HRESULT Deserialize(LPVOID dataPtr, DWORD dataSize);
};
[
    uuid(E57065B4-498F-4347-9ACC-A2C86A771720),
    version(1.0),
    helpstring("TestComVoid 1.0 Type Library")
]
library TestComVoidLib
{
    importlib("stdole2.tlb");
    [
        uuid(1DC2528B-EA49-4F89-BB56-B1D667379644),
        helpstring("MyObject Class")
    ]
    coclass MyObject
    {
        [default] interface IMyObject;
    };
};
IMyObject的第一种方法基于类型和相应的结构构造对象。第二种方法基于二进制数据构造对象

但我得到了错误MIDL2139:参数的类型不能从void或void派生*

此外,我想用IntPtr参数制作一个C#包装器来传递指针。(“添加引用”->COM->“TestComVoid 1.0类型库”)

我尝试使用INT_PTR而不是LPVOID,然后我得到INT而不是IntPtr。 我尝试使用DWORD_PTR而不是LPVOID,然后得到uint而不是IntPtr。 我试着用VARIANT代替LPVOID,然后用Object代替IntPtr


如何正确传递指向这些情况的指针?

我找到了解决方案。这些方法需要使用
local
属性。这是:

[
    object,
    uuid(618E64F5-676B-4A13-A513-DE3D4097294A),
    dual,
    nonextensible,
    helpstring("IMyObject Interface"),
    pointer_default(unique)
]
interface IMyObject : IDispatch{
    [id(1), helpstring("method Make"), local] HRESULT Make(DWORD type, LPVOID settings);
    [id(2), helpstring("method Deserialize"), local] HRESULT Deserialize(LPVOID dataPtr, DWORD dataSize);
};

您得到的是
int
而不是
IntPtr
,因为
int\u PTR
实际上定义为
“int”
。它表示
“int size指针”
——不是指向int的指针


只需使用
LPDWORD(LPINT)
而不是
INT\u PTR

一个void*与自动化不兼容。你必须通过某种类型安全的东西。就像一个安全数组(字节)。汉斯,谢谢你的回答。但如果使用类型SAFEARRAY,tlbimp将生成类型System.Array。我需要IntPtr。什么是“自动化兼容”?自动化是COM的一个子集,其核心接口是IDispatch。你正在使用的那个。这是允许不同语言和运行时环境相互使用代码的最兼容的方式。其代价是您有一组有限的类型可供使用。没有void*或IntPtr。我使用IUnknown而不是IDispatch更改了IDL文件。这是同样的问题。