IDL的内容[
local,
object,
uuid(CCB61BC5-DF19-4355-9D61-FA59C954D34D),
helpstring("ILeEventLib Interface"),
pointer_default(unique)
]interface ILeEvent: IUnknown
{
      HRESULT LeRegistMessageCallBack([in]UINT uiMessageType, [in]LPVOID pCallBack, [in]LPVOID pUserData);
      HRESULT LeUnRegistSpecificMessageCallBack([in]UINT uiMessageType, [in]LEEVENTLIBCALLBACK pCallBack);
      HRESULT LeRegistAllMessageCallBack([in]LEEVENTLIBCALLBACK pCallBack, [in]LPVOID pUserData);
      HRESULT LeUnRegistSpecificAllMessageCallBack([in]LEEVENTLIBCALLBACK pCallBack);}其中,回调函数的格式和结构体定义如下:typedef struct MessageData
{
//DWORD类型的成员1
DWORD dwData1;
//DWORD类型的成员2
DWORD dwData2;
//LPVOID类型的成员1
LPVOID lpData;
}MessageData;typedef void (*LEEVENTLIBCALLBACK)(UINT MessageType,MessageData* pMsgData,void* pUserData);编译后错误如下:
oleidl.idl
midl\oleaut32.dll : error MIDL2020 : error generating type library : SetFuncAndParamNames failed : __MIDL_0015谢谢了!!

解决方案 »

  1.   

    大家都没有遇到过同样的问题么,是不是一个回调函数的定义在IDL里只能用一次?(应该不会把)
      

  2.   

    不要用回调函数,那不符合COM规范,应该用回调接口。像这样:interface ILeEventCallback : IUnknown
    {
          HRESULT Call([in]LPVOID pUserData);
    };[
    local,
    object,
    uuid(CCB61BC5-DF19-4355-9D61-FA59C954D34D),
    helpstring("ILeEventLib Interface"),
    pointer_default(unique)
    ]
    interface ILeEvent: IUnknown
    {
          HRESULT LeRegistAllMessageCallBack([in]ILeEventCallback* pCallBack, [in]LPVOID pUserData);
          HRESULT LeUnRegistSpecificAllMessageCallBack([in]ILeEventCallback* pCallBack);
    };
      

  3.   

    我在 IDL 中也从未定义过回调函数
      

  4.   

    不要在com中使用回调函数,使用回调接口或者使用连接点
      

  5.   

    com下用连接点来实现c和c++下回调函数同样的功能。