这是一个简单的测试。函数指针类型FN_t在ITest :: Test&中出现两次。 ITEST :: Test2的。
import "oaidl.idl";
import "ocidl.idl";
typedef void(* FN_t)();
[
uuid(f5d5eb17-45c7-4cce-a176-9ed2e1083d2a),
object,
local,
pointer_default(unique)
]
interface ITest : IUnknown {
HRESULT Test(FN_t pfn);
HRESULT Test2(FN_t pfn); // !error!
}
[
uuid(04f887d2-7412-497a-8189-72e710484bfa)
]
library TestLib {
importlib("stdole2.tlb");
[
uuid(072f49e3-b94c-4d94-a368-ee72db579600)
]
coclass Test {
[default] interface ITest;
}
}
错误讯息: midl \ oleaut32.dll:错误MIDL2020:错误生成类型库:SetFuncAndParamNames失败:__ MIDL____MIDL_itf_test_0000_00000000(0x8002802C)
通过评论!错误!线,MIDL效果很好。那么为什么以及如何使代码工作呢?
=============================================== ===================================
我想我可以自己回答。
对于单个ITest :: Test方法。生成的typelib中的接口是:
interface ITest : IUnknown {
void _stdcall __MIDL____MIDL_itf_test_0000_00000000();
HRESULT _stdcall Test(ITest* pfn);
};
似乎typelib不知道函数指针类型是什么。
然后我添加了一个wire_marshal属性,它可以工作:
import "oaidl.idl";
import "ocidl.idl";
typedef [unique] void *wirePointer;
typedef [wire_marshal(wirePointer)] void(__stdcall *FN_t)();
[
uuid(f5d5eb17-45c7-4cce-a176-9ed2e1083d2a),
object,
local,
pointer_default(unique)
]
interface ITest : IUnknown {
HRESULT Test(FN_t pfn);
HRESULT Test2(FN_t pfn); // ok!!!
}
[
uuid(04f887d2-7412-497a-8189-72e710484bfa)
]
library TestLib {
importlib("stdole2.tlb");
[
uuid(072f49e3-b94c-4d94-a368-ee72db579600)
]
coclass Test {
[default] interface ITest;
}
}