为了写一个读取文件内容的dll,通过将文件路径传给dll函数进行调用。dll的编写实现如下:
1.dll生成
两个文件,头文件dataIO.h和实现文件dataIO.cpp,
其中dataIO.h如下
#include <vector>
using namespace std;
struct _declspec(dllexport) SMStruct{ //此导出结构体用于存放文件每一行的信息
char mobile[15];
//char date[9];
char datatime[20];
char comand[15];
};
struct _declspec(dllexport) SMSVecStruct{ //此导出结构体用于存放整个文件所有行的信息
int smsN;
vector<SMStruct> smsVector;
};
extern "C" _declspec(dllexport) SMSVecStruct readSMS(char *filename);//导出读取文件内容函数
dataIO.cpp文件内容如下
#include "dataIO.h"
#include <fstream>
#include <iostream>
extern "C" _declspec(dllexport) SMSVecStruct readSMS(char *filename)
{
fstream smsFile;
locale::global(std::locale(""));
smsFile.open(filename,ios::app|ios::in);
char buf[256];
int smsn=0;
SMSVecStruct smsVec;
smsFile>>buf;
while(!smsFile.eof())
{
smsn++;
SMStruct sms;
sms.mobile[0]='\0';
sms.datatime[0]='\0';
sms.comand[0]='\0';
cout<<buf<<' ';
strcat(sms.mobile,buf);
smsFile>>buf;
cout<<buf<<' ';
strcat(sms.datatime,buf);
smsFile>>buf;
cout<<buf<<endl;
strcat(sms.comand,buf);
smsFile>>buf;
smsVec.smsVector.push_back(sms);
}
smsVec.smsN=smsn;
smsFile.close();
return smsVec;
}
2.调用dll
上面的代码实现就是用于建立所需dll文件即dataIO.dll,将此dll文件放到你所新建的工程目录的debug中以供你的程序来调用,在main函数之前加入
#include "dataIO.h" (这句是因为有结构体的导出,所以要包含上面相关的头文件)
struct _declspec(dllexport) SMStruct; (这句是结构体SMStruct的导出)
struct _declspec(dllexport) SMSVecStruct;(这句是结构体SMSVecStruct的导出)
对于函数可以有多种方式导出
main函数文件代码如下
#include <iostream>
#include <Windows.h>
using namespace std;
#include "dataIO.h"
struct _declspec(dllexport) SMStruct;
struct _declspec(dllexport) SMSVecStruct;
int main()
{
typedef SMSVecStruct (*pReadSMS)(char *filename);
pReadSMS readSMS=NULL;
HINSTANCE hDll;
//wstring dllFile="dataIO.dll";
hDll=LoadLibrary("dataIO.dll");
readSMS=(pReadSMS)GetProcAddress(hDll,"readSMS");
if (readSMS)
{
SMSVecStruct smsVec=readSMS("G:\\znc\\c&c++\\allTest\\allTest\\Debug\\msgs.txt");
//cout<<"调用dll后s="<<s<<endl;
}
FreeLibrary(hDll);
getchar();
return 0;
}