数据库是ACCESS,我在窗口程序中可以访问ACCESS。现在准备在一个DLL中访问ACCESS,编译通过,但程序运行时,提示出现错误,跟踪发现是运行到打开连接对象时报错。我想问的是:
1、在DLL中访问ACCESS和在EXE文件中访问ACCESS,有没有区别?
2、DLL中访问ACCESS有什么需要设置或注意的地方?
请大家告诉我在DLL中如何访问ACCESS,有源代码最好。谢谢!

解决方案 »

  1.   

    连接代码发出来 看看
    CoInitialize都加了吗?调用的线程内
      

  2.   

    DLL中记得初始化各种AfxOleInit()等.
    进程中,窗口MFC代码会自动帮你添加一些初始化代码
      

  3.   

    源代码:DLL中
    #include <afxwin.h>
    #include <afxdisp.h>
    #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF") void SetHook(HWND hwnd)
    {
    g_hWnd=hwnd;
    isMove=FALSE; AfxOleInit();
    /* if(FAILED(CoInitialize(NULL)))
    {
    CoUninitialize();
    }
    */
    m_pConnection.CreateInstance(__uuidof(Connection)); try 

    // 打开本地Access库hero.mdbhero.mdb
    m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=hero.mdb","","",adModeUnknown);
    }
    catch(_com_error e)
    {
    AfxMessageBox("数据库连接失败,确认数据库hero.mdb是否在当前路径下!");
    } ReadConfig(); //读数据库中记录
    g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);
    g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
    }
      

  4.   

    调用DLL的程序部分源代码:
    _declspec(dllimport) void SetHook(HWND hwnd);BOOL CHookTestDlg::OnInitDialog()
    {
    CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    } // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE); // Set big icon
    SetIcon(m_hIcon, FALSE); // Set small icon

    // TODO: Add extra initialization here
    /* int cxScreen,cyScreen;
    cxScreen=GetSystemMetrics(SM_CXSCREEN);
    cyScreen=GetSystemMetrics(SM_CYSCREEN);
    SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);
    */
    isMove=FALSE;
    SetHook(m_hWnd);
    return TRUE;  // return TRUE  unless you set the focus to a control
    }
      

  5.   

    1、在DLL中,如果用AfxOleInit()初始化COM,运行时,就出现
    AfxMessageBox("数据库连接失败,确认数据库test.mdb是否在当前路径下!");2、如果用CoInitialize(NULL)初始化COM,程序能够运行,但关闭时会出现“xxxx不能为READ”的错误。个人分析可能是因为没有运行CoUninitialize()的原因。我不知道在DLL的那个函数是退出时会执行的函数,CoUninitialize()不知道能加到哪里去才合适。DLL有析构函数吗?
      

  6.   

    唯一能想到的就是需要初始化COM库。。
      

  7.   

    try  
    {  
    // 打开本地Access库hero.mdbhero.mdb
    m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=hero.mdb","","",adModeUnknown);
    }
    catch(_com_error e)
    {
    AfxMessageBox("数据库连接失败,确认数据库hero.mdb是否在当前路径下!");}这里你只输出了自己的一段话
    好歹把错误信息也输出出来啊,这样调试起来才方便
    CString str = (LPTSTR)(_bstr_t)e.Description();