分享
 
 
 

导入类型库注意先后顺序

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

COM组件通用ADO访问数据库,VC中使用组件,导入组件的类型库是报错

------------------------------------------------------------------

可能这个问题对别人来说真的不是什么问题,但是要是遇上了,会被烦死掉的,所以我还是写出来,希望别人遇上的

时候能得到帮助:

I.问题概述:

我是在做一个组件的时候,用到了ADO(msado15.dll),按照常规的方法,访问数据库(SQL2000).

<1>组件方:

方法定义:

HRESULT GetRecordset([in]BSTR queryCmd,[out,retval]_Recordset **RecordsetPtr);

实现:

STDMETHODIMP CQueryRec::GetRecordset(BSTR queryCmd,_Recordset **RecordsetPtr)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState())

CoInitialize(NULL);

_ConnectionPtr pCon(__uuidof(Connection));

_CommandPtr pCmd(__uuidof(Command));

_RecordsetPtr pSet(__uuidof(Recordset));

pCon->Open(_T("Provider=SQLOLEDB.1;Data source=127.0.0.1;Initial Catalog=Northwind"),

_T("sa"),_T(""),adOpenUnspecified);

pCmd->ActiveConnection=pCon;

CString command(queryCmd);

pCmd->CommandText=command.operator LPCTSTR();

pSet->PutRefSource(pCmd);

pSet->CursorLocation=adUseClient;

_variant_t vNull(DISP_E_PARAMNOTFOUND,VT_ERROR);

pSet->Open(vNull,vNull,adOpenDynamic,adLockOptimistic,adCmdText);

pSet->QueryInterface(__uuidof(_Recordset),(void**)RecordsetPtr);

CoUninitialize();

return S_OK;

}

<2>vc客户端:

1.在vc客户端使用组件都先要导入组件的类型库,所以我也按常规的导入了类型库

#import "GetRec.tlb"

using namespace GETRECLib;

2.然后我也想到了,组件返回的类型里有_RecordsetPtr类型的智能指针,我于是有导入了msado15.dll

#import "msado15.dll" no_namespace rename("EOF","EndOfFile")

II.错误信息:

做完上面之后,我加入了使用组件的方法,万事大吉,开工了,开始编译,错误如下:

...: error C2146: 语法错误 : 缺少“;”(在标识符“GetRecordset”的前面)

...: error C2501: “GETRECLib::IQueryRec::_RecordsetPtr” : 缺少存储类或类型说明符

...: warning C4183: “GetRecordset”: 缺少返回类型;假定为返回“int”的成员函数

...: error C2143: 语法错误 : 缺少“;”(在“GETRECLib::IQueryRec::GetRecordset”的前面)

...: error C2433: “_RecordsetPtr” : 不允许在数据声明中使用“inline”

...: error C2501: “_RecordsetPtr” : 缺少存储类或类型说明符

...: error C2064: 项不会计算为接受 2 个参数的函数

我检查了很多遍,都没其他的问题,怎么问题老是这样呢,郁闷哦,主要是这问题的错误不好查,提示就是缺";"什么的,就是语法错误,可是没语法错误,我这点还是肯定的,因为我就只在一个新的工程里写上#import "GetRec.tlb"就错了,更让我迷惑的是用VB调用这组件没问题,正常,这下我可真不知道怎么好,因为这问题不想其他的,我还可以凭平时的一点点经验查错,这我确实没法了,我也开始以为是VC的一个bug.

IIV.问题解决:

过了三四天了,我没事就拿这代码来琢磨琢磨,终于在无意中发现是自己犯了个不注意的错误,“导入库的顺序”

我在vc客户端的StdAfx.h中:

1.#import "GetRec.tlb"

2.#import "msado15.dll" no_namespace rename("EOF","EndOfFile")

vc编译器生成的"GetRec.tlh",也就是组件的头文件,里面就有_RecordsetPtr,但是在这个VC客户端里面不能识别这种类型,的确,我是在第二步导入了"msado15.dll"但是,在这之前,头文件的定义里却不能识别,编译器对一个文件的编译都上自顶向下的,所以不认识_RecordsetPtr,于是我换了导入的先后顺序,Ok,no problem!

IV.经验教训:

1.编译器对源文件的编译都有自顶向下的先后顺序,定义要放前面,也就是想上面那种问题,要先定义类型,才能识别使用。

2.其实我应该在错误信息中发现并推测问题的起因的,注意第二行"缺少存储类或类型说明符",我应该在这儿就意识到是类型没定义,但是我马虎了.

的确,查错也是一种进步^^,至少锻炼毅力

-----------------------------------------------------------------------------------------------------------------------------

vigor

2004.12.5

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有