动态库中读取数据库 用过的进来看看
MFC常规DLL。 用ADO连接数据库Sqlserver 2000
在InitInstance()函数中,连接数据库
在ExitInstance()函数中 关闭连接。
测试程序:一个对话框程序,两个按钮 一个动态加载,一个动态卸载。
问题:当加载动态库后,先点卸载按钮,程序正常。当不卸载动态库,直接关闭对话框程序,程序报错。
//代码如下
声明
class CD3App : public CWinApp
{
public:
bool OpenDatabase();
CD3App();
///////////////////
_ConnectionPtr m_pConn;
}
BOOL CD3App::InitInstance()
{
//初始化COM环境
::CoInitialize(NULL);
OpenDatabase();
return CWinApp::InitInstance();
}
bool CD3App::OpenDatabase()
{
CString strCon="driver={SQL Server};Server=(local);DATABASE= test;UID=sa;PWD=sa";
try
{
HRESULT hr=m_pConn.CreateInstance("ADODB.Connection"); //__uuidof(Connection)
if(SUCCEEDED(hr))
{
hr=m_pConn->Open(_bstr_t(m_strCon),"","",adModeUnknown);//
}
}
catch(_com_error &e)
{
return false;
}
if(SUCCEEDED(hr))
return true;
else
return false;
}
int CD3App::ExitInstance()
{
// 关闭连接 释放对象
if( adStateOpen ==m_pConn->State )
{
m_pConn->Close();//当调用程序直接退出的时候 ,报错 }
m_pConn.Release();
::CoUninitialize();
return CWinApp::ExitInstance();
}
//////调用程序 一个对话框(2个按钮)
加载动态库
HMODULE hDll2=NULL
void CDllTestDlg::OnButton3()
{
hDll2=::LoadLibrary("D3.dll");
if(hDll2==NULL)
{
AfxMessageBox("加载D3.dll库失败",MB_ICONWARNING);
return;
}
}
//卸载动态库
void CDllTestDlg::OnButton4()
{
if(hDll2!=NULL)
FreeLibrary(hDll2);
}
//如果按照 正常顺序操作 即 加载 -- 卸载,则程序不会有问题
如果加载后,不卸载,直接关闭对话框测试程序,则程序会报错。请问为什么。谢谢