DalHelper.dll中定义了这样一个函数:
// 执行查询
extern "C" DALHELPER_API _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
// 创建记录集对象
m_pRecordSet.CreateInstance(__uuidof(Recordset));
// 取得表中的记录
m_pRecordSet->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉异常
catch(_com_error &e) //_com_error这是一种数据类型.就好比int,char这类的数据类型一样,&e是表示是这种类型的引用.
{
// 显示错误信息
MessageBox(NULL,e.Description(),_T("错误提示"),0); //非MFC工程不能用AfxMessageBox
}
// 返回记录集
return m_pRecordSet;
}
exe项目中调用这个函数:
void CSysLoginDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CHotelManageApp* pApp = (CHotelManageApp*)AfxGetApp();
UpdateData(true);
CString m_btSQL;
HINSTANCE hDll; //DLL句柄
hDll = LoadLibrary(_T("DalHelper.dll"));
if (NULL==hDll)
{
MessageBox(_T("DLL加载失败"));
}
typedef _RecordsetPtr (*peDalHelper)(_bstr_t btSQL);
peDalHelper pGetRecordSet; //函数指针
pGetRecordSet = (peDalHelper)GetProcAddress(hDll,"GetRecordSet");
if (pGetRecordSet != NULL)
{
m_btSQL = "select * from tbUser WHERE UserName = '" + (_bstr_t)m_login_username + "'" ;
_RecordsetPtr m_pRecordSet = pGetRecordSet(_bstr_t(m_btSQL));
if(m_pRecordSet->adoEOF)
{
AfxMessageBox(L"帐号错误!");
}
else
{
if(m_pRecordSet->Fields->GetItem("UserPassWord")->Value != m_login_password)
{
AfxMessageBox(L"密码错误!");
}
else
{
pApp->m_bSuccessLogin = true;
FreeLibrary(hDll);
CDialogEx::OnOK();
}
}
}
FreeLibrary(hDll);
}
调试的时候发现传到dll里的bstrSQL要么空,要么是一串乱码。只要执行到GetRecordSet(_bstr_t bstrSQL)导致程序崩溃。
求助各位路过的大虾们怎么解决啊??