DLL中如何访问数据库?

stevenuserregister 2010-12-01 01:10:14
数据库是ACCESS,我在窗口程序中可以访问ACCESS。现在准备在一个DLL中访问ACCESS,编译通过,但程序运行时,提示出现错误,跟踪发现是运行到打开连接对象时报错。

我想问的是:
1、在DLL中访问ACCESS和在EXE文件中访问ACCESS,有没有区别?
2、DLL中访问ACCESS有什么需要设置或注意的地方?


请大家告诉我在DLL中如何访问ACCESS,有源代码最好。谢谢!
...全文
279 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mayudong1 2010-12-01
  • 打赏
  • 举报
回复
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();
周成风 2010-12-01
  • 打赏
  • 举报
回复
唯一能想到的就是需要初始化COM库。。
stevenuserregister 2010-12-01
  • 打赏
  • 举报
回复
1、在DLL中,如果用AfxOleInit()初始化COM,运行时,就出现
AfxMessageBox("数据库连接失败,确认数据库test.mdb是否在当前路径下!");

2、如果用CoInitialize(NULL)初始化COM,程序能够运行,但关闭时会出现“xxxx不能为READ”的错误。个人分析可能是因为没有运行CoUninitialize()的原因。我不知道在DLL的那个函数是退出时会执行的函数,CoUninitialize()不知道能加到哪里去才合适。DLL有析构函数吗?
stevenuserregister 2010-12-01
  • 打赏
  • 举报
回复
调用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
}

stevenuserregister 2010-12-01
  • 打赏
  • 举报
回复
源代码:

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);
}
oyljerry 2010-12-01
  • 打赏
  • 举报
回复
DLL中记得初始化各种AfxOleInit()等.
进程中,窗口MFC代码会自动帮你添加一些初始化代码
jacklzw88 2010-12-01
  • 打赏
  • 举报
回复
连接代码发出来 看看
CoInitialize都加了吗?调用的线程内

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧