0

这是一个简单的测试。函数指针类型 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;
    }
}
4

0 回答 0