我按照MSDN的做法已经可以了成功了,后来我把一个COM接口方法的参数增加了一个,就出问题了,当我试图编译.mk文件(用nmake -f MyProjectPS.mk指令)生成代理/存根代码的时候,出现以下的错误:
Microsoft (R) Program Maintenance Utility   Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.        cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL  LibManagerServer_p.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.LibManagerServer_p.c
LibManagerServer.h(548) : error C2143: syntax error : missing ')' before '*'
LibManagerServer.h(548) : error C2081: '_Recordset' : name in formal parameter list illegal
LibManagerServer.h(548) : error C2143: syntax error : missing ';' before '*'
LibManagerServer.h(548) : error C2059: syntax error : '*'
LibManagerServer.h(548) : error C2059: syntax error : ')'
LibManagerServer.h(551) : error C2059: syntax error : '}'
LibManagerServer.h(600) : error C2143: syntax error : missing ')' before '*'
LibManagerServer.h(600) : error C2081: '_Recordset' : name in formal parameter list illegal
LibManagerServer.h(600) : error C2143: syntax error : missing '{' before '*'
LibManagerServer.h(600) : error C2059: syntax error : ')'
似乎是说那个_Recordset对象是非法的,我把原来的增加的参数改了回去,也不行,还是出现这个错误,谁知道是怎么回事啊?

解决方案 »

  1.   

    把你的IDL文件的内容贴出来!
      

  2.   

    这是我的IDL文件,大家帮忙看看啊
    // LibManagerServer.idl : IDL source for LibManagerServer.dll
    //// This file will be processed by the MIDL tool to
    // produce the type library (LibManagerServer.tlb) and marshalling code.import "oaidl.idl";
    import "ocidl.idl";
    struct USERINFO
    {
    BSTR UserID;
    BSTR UserPW;
    };
    struct CREATEUSER
    {
    BSTR UserID;
    long AccessLevel;
    };
    struct REGISTERUSER
    {
    BSTR UserName;
    BSTR UserDepartment;
    BSTR UserAddress;
    BSTR LiaisonMethod;
    BSTR Re;
    BSTR NewPW;
    };
    struct CREATEEXPERIMENT
    {
    BSTR ExpName;
    BSTR PrincipalID;
    BSTR Re;
    BSTR ExpDemand;
    };
    struct CREATESUBEXP
    {
    long ExpID;
    BSTR SubExpName;
    BSTR PrincipalID;
    BSTR SubExpRe;
    BSTR SubExpDemand;
    };
    struct CREATEGROUP
    {
    BSTR GroupName;
    BSTR Re;
    };
    struct ADDUSER2GROUP
    {
    long GroupID;
    BSTR UserID;
    };
    struct ADDEXP2GROUP
    {
    long GroupID;
    long ExpID;
    };
    struct STARTEXPERIMENT
    {
    BSTR UserID;
    BSTR UserPW;
    long SubExpID;
    };
    struct ENDEXPERIMENT
    {
    BSTR UserID;
    long SubExpID;
    long Grade;
    BSTR Re;
    };[
    uuid(A2B39270-A778-480f-9CEB-DEF31E9B20B4),
    version(1.1),
    helpstring("LibManagerServer 1.1 Type Library")
    ]
    library LIBMANAGERSERVERLib
    {
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");
    importlib("C:\Program Files\Common Files\System\ado\msado15.dll");
    [
    object,
    uuid(1FFD5BB9-66D8-4277-BE87-603DD4A6DD47),
    dual,
    helpstring("ILibMng2 Interface"),
    pointer_default(unique)
    ]
    interface ILibMng2 : IDispatch
    {

    [id(1), helpstring("method GetRs")] HRESULT GetRs([in] struct USERINFO UserInfo,[in] BSTR bstrQuery,[out,retval] _Recordset **ppRs);
    };
    [
    object,
    uuid(2682FC51-1CD8-4840-8072-E37D0D09E451),

    helpstring("ILibMng Interface"),
    pointer_default(unique)
    ]
    interface ILibMng : IUnknown
    {
    [helpstring("method ValidateUser")] HRESULT ValidateUser([in] struct USERINFO UserInfo);
    [helpstring("method CreateUser")] HRESULT CreateUser([in] struct USERINFO Creater,[in] struct CREATEUSER UserInfo);
    [helpstring("method GetAccessLevel")] HRESULT GetAccessLevel([in]struct USERINFO UserInfo);
    [helpstring("method RegisterUser")] HRESULT RegisterUser([in] struct USERINFO UserInfo,[in] struct REGISTERUSER RegInfo);
    [helpstring("method CreateExperiment")] HRESULT CreateExperiment([in] struct USERINFO Creater,[in] struct CREATEEXPERIMENT Experiment,[out,retval]long *pExpID);
    [helpstring("method CreateSubExperiment")] HRESULT CreateSubExperiment([in] struct USERINFO Creater,[in] struct CREATESUBEXP SubExp);
    [helpstring("method CreateGroup")] HRESULT CreateGroup([in] struct USERINFO Creater,[in] struct CREATEGROUP GroupInfo);
    [helpstring("method AddUser2Group")] HRESULT AddUser2Group([in] struct USERINFO Creater,[in] struct ADDUSER2GROUP Group4User);
    [helpstring("method AddExp2Group")] HRESULT AddExp2Group([in] struct USERINFO Creater,[in] struct ADDEXP2GROUP Exp4Group);
    [helpstring("method StartExperiment")] HRESULT StartExperiment([in] struct STARTEXPERIMENT StartInfo);
    [helpstring("method EndExperiment")] HRESULT EndExperiment([in] struct USERINFO Creater,[in] struct ENDEXPERIMENT  EndInfo);
    }; [
    uuid(94B374A0-83F5-4958-8B68-C6D9B7C0CDDC),
    helpstring("LibMng Class")
    ]
    coclass LibMng
    {
    [default] interface ILibMng;
    interface ILibMng2;
    };
    };
      

  3.   

    你把import "ocidl.idl"注释掉试一下,再不行你只好用IDispatch*作接口类型了。
      

  4.   

    使用IDispatch就可以了这样省去很多麻烦
    因为你的Recordset也是IDispatch继承过来的客户端直接转换过去就OK了
      

  5.   

    怎么用IDispatch接口,能否给个服务和客户的例子?