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

时间:2012-01-25 22:00:52

标签: 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 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。

如何正确地将指针传递给这些案例?

2 个答案:

答案 0 :(得分:4)

我找到了解决方案。它需要对这些方法使用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);
};

答案 1 :(得分:0)

您的int代替IntPtr,因为INT_PTR确实定义为"int"。它表示"int size pointer" - 不是指向int的指针。

只需使用LPDWORD (LPINT)代替INT_PTR