Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数指针typedef在MIDL中只允许一次?_C++_Visual C++_Com_Atl_Midl - Fatal编程技术网

C++ 函数指针typedef在MIDL中只允许一次?

C++ 函数指针typedef在MIDL中只允许一次?,c++,visual-c++,com,atl,midl,C++,Visual C++,Com,Atl,Midl,这里有一个简单的测试。函数指针类型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

这里有一个简单的测试。函数指针类型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:error MIDL2020:生成类型库时出错:SetFuncAndParamNames失败:_midl_____midl_itf_测试_0000_00000000(0x8002802C)

通过评论!错误行,MIDL运行良好。那么为什么以及如何使代码工作呢

==================================================================================

我想我可以自己回答

对于单个ITest::测试方法。生成的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;
    }
}

您的界面与自动化不兼容。不要试图将其放入类型库中-其格式在物理上无法充分描述此类接口。任何自动化客户端(一种可能受益于类型库的客户端)都无法调用此接口。COM的函数指针等价物是具有单个方法的接口。@HansPassant,但本地接口接受函数指针