![]() |
#2
wyl_lsz2012-09-30 22:46
|
本人写的DLL是MFC规则DLL,可以在MFC程序中调用,非常的简便易用。
首先要说的是数据库参数的配置问题,这些参数包括数据库的类型、版本,如果安全权限则还需要设定密码和口令。故而在本DLL中设计了一个类似于普通MFC EXE程序的参数设定对话框,DBConfigDlg.h和DBConfigDlg.cpp。
只有本站会员才能查看附件,请 登录
一些关键代码为:

void CDBConfigDlg::OnApply()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(BST_CHECKED==((CButton*)GetDlgItem(IDC_PASSWORDENABLE))->GetCheck())
{
GetDlgItem(IDC_USERID)->GetWindowText(UserID);
GetDlgItem(IDC_PASSWORD)->GetWindowText(Password);
}
IsApplyed=TRUE;
OnOK();
}
void CDBConfigDlg::OnCancel()
{
// TODO: Add extra cleanup here
IsApplyed=FALSE;
CDialog::OnCancel();
}
void CDBConfigDlg::OnPasswordenable()
{
// TODO: Add your control notification handler code here
if(BST_CHECKED==((CButton*)GetDlgItem(IDC_PASSWORDENABLE))->GetCheck())
{
GetDlgItem(IDC_USERID)->EnableWindow(TRUE);
GetDlgItem(IDC_PASSWORD)->EnableWindow(TRUE);
}
else
{
GetDlgItem(IDC_USERID)->SetWindowText("");
GetDlgItem(IDC_PASSWORD)->SetWindowText("");
GetDlgItem(IDC_USERID)->EnableWindow(FALSE);
GetDlgItem(IDC_PASSWORD)->EnableWindow(FALSE);
}
}
然后是数据库的连接函数,此函数在DLL中导出,用于各位调用。

//连接数据库
BOOL __stdcall ConnectDB(DBPARAM* DBParam,_ConnectionPtr pConn)
{
try
{
CString connStr;
switch(DBParam->DBVersion)
{
case 0://MS ACCESS2000
connStr=_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=")+DBParam->DBPath+_T(";Persist Security Info=false");
break;
case 1://MS ACCESS2003
connStr=_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=")+DBParam->DBPath+_T(";Persist Security Info=false");
break;
case 2://MS ACCESS2007
connStr="Provider=Microsoft.ACE.OLEDB.12.0;DataSource=";
connStr+=DBParam->DBPath;
break;
case 3://MS SQL SEVER2000
connStr="Provider=sqloledb;DataSource=";
connStr+=DBParam->DBPath;
break;
case 4://Oracle
connStr="Provider=OraOLEDB.Oracle;DataSource=";
connStr+=DBParam->DBPath;
break;
default://MS ACCESS2000
connStr="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=";
connStr+=DBParam->DBPath;
break;
}
_bstr_t Connection=connStr;
if(DBParam->IsPasswordEnabled)//带密码的访问
pConn->Open(Connection,(LPCTSTR)(DBParam->UserID),(LPCTSTR)(DBParam->Password),adConnectUnspecified);
else//不带密码的访问
pConn->Open(Connection,"","",adConnectUnspecified);
}
catch (_com_error e)
{
return FALSE;
}
return TRUE;
}
然后是SQL语句的执行函数

BOOL __stdcall CheckRecordSet(CString SQLCommand,_ConnectionPtr pConn,_RecordsetPtr pRecordset)
{
try
{
pRecordset->Open(_variant_t(SQLCommand.GetBuffer(SQLCommand.GetLength())),_variant_t(pConn,true),adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
return FALSE;
}
return TRUE;
}
当然对于DLL来说,接口函数的导出至关重要,这里也把接口函数的导出代码贴出来。

#include "stdafx.h"
struct DBPARAM
{
BOOL IsPasswordEnabled;
int DBVersion;
CString Password;
CString UserID;
CString DBPath;
};
extern "C" __declspec(dllexport) BOOL __stdcall SetDBParams(DBPARAM* DBParam);
extern "C" __declspec(dllexport) BOOL __stdcall ConnectDB(DBPARAM* DBParam,_ConnectionPtr pConn);
extern "C" __declspec(dllexport) BOOL __stdcall CheckRecordSet(CString SQLCommand,_ConnectionPtr pConn,_RecordsetPtr pRecordset);
最后自己写了一个测试程序,用于测试该DLL,运行效果如图:
只有本站会员才能查看附件,请 登录
需要程序代码的,发E-mail至worm.msblast@