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);
} //如果按照 正常顺序操作 即 加载 -- 卸载,则程序不会有问题
如果加载后,不卸载,直接关闭对话框测试程序,则程序会报错。请问为什么。谢谢
在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);
} //如果按照 正常顺序操作 即 加载 -- 卸载,则程序不会有问题
如果加载后,不卸载,直接关闭对话框测试程序,则程序会报错。请问为什么。谢谢
解决方案 »
- 求教:VS2008在对话框上动态增加按钮的问题
- CDockablePane自动隐藏后出现的问题
- 防火墙能发现伪造的IP吗?
- 释放内存通不过验证
- 关于mc.exe
- 关于menubar高度和左边空隙的问题,希望GUI高手解答
- 如何获得Form中InputTextElement以前的网页的文本?
- 如何实现一个程序,使得该程序能自动在其他dialog中的CEdit对象填入数据以及点击按钮
- _ftprintf_s或fwprintf_s怎么无法往文本文件中输出中文字符??
- 这种xml带中文标签的怎么才能把内容扒下来啊
- 为何通过cin可以为数组名赋值呢?数组地址是常量呀?大家看看代码
- 郁闷啊,google了一天也没个解决办法(clistctrl虚表的问题)
m_pConn->Close();//当调用程序直接退出的时候 ,报错 }
m_pConn.Release();
}
catch(....)看看是什么错误.....
弹出的错误如下:
Unhandled exception in DllTest.exe (MSDART.Dll):0xC0000005:Access Violation如果按着加载LoadLibrary 再卸载FreeLibary的顺序 在关闭调用程序 则没有问题。
如果不卸载 直接关闭调用程序,则报错
if(hDll2!=NULL)
FreeLibrary(hDll2);
::ExitInstance()
导致了ado没有关,资源没有释放吧