我用VC建立了一个常规DLL,里面想封装ADO数据库操作,并在stdAfx.h中加入如下语句
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("LockTypeEnum","adoLockTypeEnum")  rename("EOF","adoEOF") rename("DataTypeEnum","adoDataTypeEnum") rename("FieldAttributeEnum","adoFieldAttributeEnum") rename("EditModeEnum","adoEditModeEnum") rename("RecordStatusEnum","adoRecordStatusEnum")rename("ParameterDirectionEnum","adoParameterDirectionEnum")
在InitInstance函数中加入COM初始化函数语句AfxOleInit()初始化COM。但是问题是我写了一个导出函数用语连接数据库在调用
hr = m_pConnection.CreateInstance("ADODB.Connection");
的时候hr返回值就是错误的,为什么呢?我在DLL外面的exe也是这样做的,但是没有出错啊,为什么呢?

解决方案 »

  1.   

    也许AfxOleInit等函数也需要在动态库中写吧====仅供参考=====
      

  2.   

    如果你的dll用了mfc,函数最开头应该调用:AFX_MANAGE_STATE(AfxGetStaticModuleState());
    hr返回是什么?
      

  3.   

    在MFC AppWizard[dll]下生成DLL文件又有三种方式,在创建DLL是,要根据实际情况选择创建DLL的方式。一种是常规DLL静态链接到MFC,另一种是常规DLL动态链接到MFC。两者的区别是:前者使用的是MFC的静态链接库,生成的DLL文件长度大,一般不使用这种方式,后者使用MFC的动态链接库,生成的DLL文件长度小;动态链接到MFC的规则DLL所有输出的函数应该以如下语句开始: 
    AFX_MANAGE_STATE(AfxGetStaticModuleState( )) //此语句用来正确地切换MFC模块状态你可以参考一下。
      

  4.   

    _ConnectionPtr ConstructDatabaseConnection(CString strConnection)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    _ConnectionPtr m_pConnection;
    HRESULT hr;
    _bstr_t strConnect;
    try
    {
    hr = m_pConnection.CreateInstance("ADODB.Connection");//create connection object

    strConnect = strConnection;
    if(SUCCEEDED(hr))
    hr= m_pConnection->Open(strConnect,"","",adModeUnknown);

    }
    catch(_com_error e)
    {
    CString errormessage;
    errormessage.Format("ConstructDatabaseConnection Error.");
    AfxMessageBox(errormessage);
    return FALSE;
    }
    if(m_pConnection == NULL)
    {
    MessageBox(NULL, "OK", "Connect success", MB_OK);
    return NULL;
    }
    m_pConnection->Close();
    return m_pConnection;
    }不行啊,加上AFX_MANAGE_STATE(AfxGetStaticModuleState());后,在_ConnectionPtr m_pConnection;
    的时候就抱错了,郁闷!
      

  5.   

    每个导出函数的第一句代码:
    AFX_MANAGE_STATE(AfxGetStaticModuleState());