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); 
} //如果按照 正常顺序操作 即 加载 -- 卸载,则程序不会有问题 
如果加载后,不卸载,直接关闭对话框测试程序,则程序会报错。请问为什么。谢谢

解决方案 »

  1.   

    try{
        m_pConn->Close();//当调用程序直接退出的时候 ,报错   } 
        m_pConn.Release(); 
    }
    catch(....)看看是什么错误.....
      

  2.   

    跟踪到Close()函数里面去,发现是HRESULT _hr = raw_Close();报错。
    弹出的错误如下:
    Unhandled  exception  in DllTest.exe (MSDART.Dll):0xC0000005:Access Violation如果按着加载LoadLibrary  再卸载FreeLibary的顺序 在关闭调用程序 则没有问题。
    如果不卸载 直接关闭调用程序,则报错 
      

  3.   

    你在关闭窗口的消息里面加判断退出
    if(hDll2!=NULL)
        FreeLibrary(hDll2);
      

  4.   

    不卸载,应该就是下面的消息没有执行
    ::ExitInstance() 
    导致了ado没有关,资源没有释放吧
      

  5.   

    不要在InitInstance和ExitInstance里面创建数据库连接。参考MSDN中关于DLLMain的说明