数据库是ACCESS,我在窗口程序中可以访问ACCESS。现在准备在一个DLL中访问ACCESS,编译通过,但程序运行时,提示出现错误,跟踪发现是运行到打开连接对象时报错。我想问的是:
1、在DLL中访问ACCESS和在EXE文件中访问ACCESS,有没有区别?
2、DLL中访问ACCESS有什么需要设置或注意的地方?
请大家告诉我在DLL中如何访问ACCESS,有源代码最好。谢谢!
1、在DLL中访问ACCESS和在EXE文件中访问ACCESS,有没有区别?
2、DLL中访问ACCESS有什么需要设置或注意的地方?
请大家告诉我在DLL中如何访问ACCESS,有源代码最好。谢谢!
CoInitialize都加了吗?调用的线程内
进程中,窗口MFC代码会自动帮你添加一些初始化代码
#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);
}
_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
}
AfxMessageBox("数据库连接失败,确认数据库test.mdb是否在当前路径下!");2、如果用CoInitialize(NULL)初始化COM,程序能够运行,但关闭时会出现“xxxx不能为READ”的错误。个人分析可能是因为没有运行CoUninitialize()的原因。我不知道在DLL的那个函数是退出时会执行的函数,CoUninitialize()不知道能加到哪里去才合适。DLL有析构函数吗?
{
// 打开本地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();