我写个dll,封装了ado的部分功能,这个类里面有 纪录集指针, 做为私有成员,
函数代码如下: _RecordsetPtr CSqlOperateDll::Query(TCHAR* sql)
{
_variant_t ra; if(sql==NULL)
{
throw _T("sql语句为空");
} if(m_pConn==NULL)
{
throw _T("数据库没有打开");
} //查询 try
{
m_pRes.CreateInstance(_uuidof(Recordset));
m_pRes->Open(_bstr_t(sql),m_pConn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
} catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format(_T("修改记录失败!\r\n错误信息:%s") ,e.ErrorMessage() );
AfxMessageBox(errormessage);
}
return m_pRes; //返回记录集,供其他程序用
}
代码应该没有问题啊 ,对吧?为了测试这个函数的正确性,我写了基于对话框的程序来测试, 结果立即报错。error LNK2019: 无法解析的外部符号 "public: class _com_ptr_t<class _com_IIID<struct ADODB::_Recordset,&struct __s_GUID const _GUID_00000556_0000_0010_8000_00aa006d2ea4> > __thiscall CSqlOperateDll::Query(char *)" (?Query@CSqlOperateDll@@QAE?AV?$_com_ptr_t@V?$_com_IIID@U_Recordset@ADODB@@$1?_GUID_00000556_0000_0010_8000_00aa006d2ea4@@3U__s_GUID@@B@@@@PAD@Z),该符号在函数 "public: void __thiscall CTestDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CTestDlg@@QAEXXZ) 中被引用
意思是找不到这个函数,无法解析,lib, .h文件都拷到了测试程序的目录下面, 也#pragma comment(lib,..)了所以不存在没有拷lib文件的说法了。而把这个dll的.h .cpp文件放在对话框的工程之下,直接包含,不用dll,就没有错误。很奇怪,
这是为什么啊?
函数代码如下: _RecordsetPtr CSqlOperateDll::Query(TCHAR* sql)
{
_variant_t ra; if(sql==NULL)
{
throw _T("sql语句为空");
} if(m_pConn==NULL)
{
throw _T("数据库没有打开");
} //查询 try
{
m_pRes.CreateInstance(_uuidof(Recordset));
m_pRes->Open(_bstr_t(sql),m_pConn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
} catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format(_T("修改记录失败!\r\n错误信息:%s") ,e.ErrorMessage() );
AfxMessageBox(errormessage);
}
return m_pRes; //返回记录集,供其他程序用
}
代码应该没有问题啊 ,对吧?为了测试这个函数的正确性,我写了基于对话框的程序来测试, 结果立即报错。error LNK2019: 无法解析的外部符号 "public: class _com_ptr_t<class _com_IIID<struct ADODB::_Recordset,&struct __s_GUID const _GUID_00000556_0000_0010_8000_00aa006d2ea4> > __thiscall CSqlOperateDll::Query(char *)" (?Query@CSqlOperateDll@@QAE?AV?$_com_ptr_t@V?$_com_IIID@U_Recordset@ADODB@@$1?_GUID_00000556_0000_0010_8000_00aa006d2ea4@@3U__s_GUID@@B@@@@PAD@Z),该符号在函数 "public: void __thiscall CTestDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CTestDlg@@QAEXXZ) 中被引用
意思是找不到这个函数,无法解析,lib, .h文件都拷到了测试程序的目录下面, 也#pragma comment(lib,..)了所以不存在没有拷lib文件的说法了。而把这个dll的.h .cpp文件放在对话框的工程之下,直接包含,不用dll,就没有错误。很奇怪,
这是为什么啊?
解决方案 »
- 如何修改右击任务栏的程序时显示的<TODO:文件说明>(具体进来看图)
- 这么大个论坛真的没人知道???????在线等一小时0回复????
- 在IE插件里面如何监听到 浏览器打开一个新的网页或者网页被刷新?
- 怎样通过查询注册表用VC实现判断不同类型的USB设备??
- COM组件调用的问题
- ===关于Detours截获Socket API函数===
- 请问我在VC60中在对话框中新添了一个按钮.我想从程序中来修改按钮的标题,不知怎么做啊!
- 如何用MFC获取操作系统版本和语言版本
- 在VC单文档中嵌入EXCEL,如何获得当前单元格的行、列号?比如选了“B3”这个单元格,在程序中怎样获得它得行:3 ;列:2(B) 。我这么试
- 数据库存取图片的问题,数据库自身可以识别这些数据的问题
- VC操作SQL数据库记录
- 请问win32有没有什么api可以创建给定路径下的所有文件夹??
CSqlOperateDll类需要导出
{
public:
CSqlOperateDll(void);
~CSqlOperateDll(void);public:
BOOL ConnDataBase(); // 初始化com,并连接数据库,用户名字,密码等信息已经在函数体里面
BOOL DisConn(); //断开连接,并做善后工作public:
_RecordsetPtr Query(TCHAR* sql); //查询
BOOL ExecSql(TCHAR* sql); //执行sql,不返回记集 private:
_ConnectionPtr m_pConn; //连接指针
_RecordsetPtr m_pRes; //结果集指针
};
{ /*
try
{
sql.Query(_T("nihao")); //报错 }
catch(char* error)
{
AfxMessageBox(error);
}
*/ if(sql.ConnDataBase()) //为什么这个可以调用, 不会报错呢? {
AfxMessageBox(_T("dddddd"));
}
}
写几个类似movefirst,movenext,getstring什么的封装函数吧
rename("EOF","EndOfFile") \
rename("LockTypeEnum","newLockTypeEnum")\
rename("DataTypeEnum","newDataTypeEnum")\
rename("FieldAttributeEnum","newFieldAttributeEnum")\
rename("EditModeEnum","newEditModeEnum")\
rename("RecordStatusEnum","newRecordStatusEnum")\
rename("ParameterDirectionEnum","newParameterDirectionEnum")在stdafx.h里加这个试一下