vpp*_*vpp 4 com idl atl void-pointers
我正在开发 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;
};
};
Run Code Online (Sandbox Code Playgroud)
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);
};
Run Code Online (Sandbox Code Playgroud)