因需要,要利用
VC
和
ADO
接口编写一个
dll
模块实现对数据库中数据的处理。然后上层程序可以调用此
DLL
。
通过这个这个模块,熟悉了
DLL
模块的编写与调用方法和
ADO
组件的使用方法。现总结如下:
一.
DLL
模块的编写与调用
1) DLL
编写:
1
.在头文件(
lib.h
)声明要从
DLL
导出的函数
extern "C" void __declspec(dllexport)
getzhishi
(int nArray[5500][6],char* sczm[5500],float fTime[5500],float nrate=10);
2
.
在文件(
lib.cpp
)定义该函数
void
getzhishi(int nArray[5500][6],char* sczm[5500],float fTime[5500],float nrate)
{
}
2)
DLL
调用(dllCall.cpp):(以显式方式调用DLL:通过WINAPI函数)
//
dllCall.cpp :
以显式方式调用DLL
#include
"stdafx.h"
#include
"windows.h"
//
需要定义一个函数指针类型指向要调用的函数。
typedef void ( * lpAddFun)(int nArray[100][7],char* sczm[100],float fTime[5500],float nrate);
int
main(int argc, char* argv[])
{
HINSTANCE hDll; //DLL
句柄
lpAddFun addFun; //
函数指针
int nArray[5500][7];
char* sczm[5500];
float fTime[5500];
hDll = LoadLibrary("..//Debug//dllTest.dll"); // ..//
是本文件所在目录的上级目录的上级马目录(这里是把
DLL
程序和调用程序放在同一个工程文件里)获得
DLL
库的访问句柄
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll,"getzhishi"); //
获得函数指针(可指定函数名)
if(addFun!=NULL)
{
addFun(nArray,sczm,fTime,100); //
通过函数指针调用该函数
for(int i=0;i<290;i++)
{
// for(int i=0;i<7;i++)
printf("%s,%d,%d,%d,%d,%d,%d,%5.3f/n",sczm[i],nArray[i][0],nArray[i][1],nArray[i][2],nArray[i][3],nArray[i][4],nArray[i][5],fTime[i]);
}
}
FreeLibrary(hDll);
}
return 0;
}
#import
"C:/Program Files/Common Files/System/ADO/msado15.dll" no_namespace named_guids rename("EOF","adoEOF")
二.
在
VC
中运
ADO
(
COM
动态库):
1.
在头文件(
lib.h
)引入
ADO
库文件
#import
"C:/Program Files/Common Files/System/ADO/msado15.dll" no_namespace named_guids rename("EOF","adoEOF")
2.
加入头文件
#include
<comutil.h> //_variant_t
在其中定义
3.
初始化
OLE/COM
库环境并
连接数据库
CoInitialize(NULL);
//
初始化
OLE/COM
库
_ConnectionPtr m_pConnection;
HRESULT hr=NULL;
m_pConnection.CreateInstance(__uuidof(Connection));
m_pConnection->Open("Data Source=dtata7;UID=23;PWD=23;","","",adModeUnknown); //
用户名和密码可以随便设,没有影响
4
.查询数据库 ,并对从ADO获取的
_variant_t
类型数据进行转换成C++支持的类型。(字符串转化成char*,与整形的转化方式不一样。)
_RecordsetPtr m_pRecordset;
_variant_t RecordsAffected;
_variant_t vIndex = (long)0;
_variant_t vCount, vCount4;
int
i=0;
int
m=0;
char
*zhanming ="/0";
int
num=0;
char
*str="SELECT* FROM JZ050307 WHERE (XXLX<6)";
m_pRecordset=m_pConnection->Execute((_bstr_t)str,&RecordsAffected,adCmdText);
for
( m=0;m<5500;m++)//
可在次出修改值,改变要提取的记录的条数
{
vIndex = _variant_t((long)3);
vCount=m_pRecordset->GetCollect(vIndex); //
获取此记录的第3个字段值
if
(vCount.vt!=VT_NULL)
//zhanming=(char*)(vCount.pcVal); //BSTR
为指向字符串的32位指针。_bstr_t类封装了对BSTR的操作
zhanming=_com_util::ConvertBSTRToString((_bstr_t)vCount); //
将BSTR转化为CHAR*
//zhanming=(char*)(_bstr_t)vCount; //*pcVal
else
zhanming="
空";
sczm[m]=zhanming;
for
(i=0;i<7;i++)
{
vIndex = _variant_t((long)(i+4));
vCount=m_pRecordset->GetCollect(vIndex);
if
(vCount.vt!=VT_NULL)
{
if(i!=2&&i!=4&&i!=6)
nArray[m][i]=vCount.iVal; //
获取INT值
else if(i==6)
fTime[m]=vCount.lVal/nrate;
else
nArray[m][i]=vCount.lVal;
}
else
nArray[m][i]=0;
//nArray[m][6]=nArray[m][6]/nrate;
num++;
m_pRecordset->MoveNext();
} //
读取100个数据的循环 、结束
5
.关闭数据库连接,撤消
OLE/COM
库环境
m_pRecordset->Close();///
关闭记录集
m_pConnection->Close();///
关闭连接
CoUninitialize();
转载请注明原文地址: https://ibbs.8miu.com/read-30746.html