我按照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对象是非法的,我把原来的增加的参数改了回去,也不行,还是出现这个错误,谁知道是怎么回事啊?
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对象是非法的,我把原来的增加的参数改了回去,也不行,还是出现这个错误,谁知道是怎么回事啊?
// 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;
};
};
因为你的Recordset也是IDispatch继承过来的客户端直接转换过去就OK了