0
点赞
收藏
分享

微信扫一扫

win32 dll导出类的使用


       因为普通的dll只能导出函数,所以我们需要进行转换,也即在导出的函数中进行类对象的新建过程,返回类对象的指针,同时在客户端重新声明该类,然后进行通过返回的指针进行调用,但是有一点需要我们注意的是,在进行类成员函数调用的时候,会出现不能解析的错误,因为如果普通类的成员函数在连接过程中就需要获得类成员函数的地址,而显然在这种情况下是不行的我们需要在程序运行过程中获得函数地址,现在知道了吧??对,虚函数我们使用继承的概念,在基类当中声明若干需要使用的函数为纯虚函数,在子类中实现,导出函数中返回类型是基类,返回子类的实例,当然在客户端中重新声明下基类即可进行调用

例程如下:

dll当中,进行类的声明

extern "C" __declspec(dllexport) class
CStreamFile_pub{
protected:
void* ptr;
char* pFileName;
public:
virtual void setFileName(char* fName)=0;
virtual int getFileSize()=0;
virtual char* ReadtoEnd(int position)=0;
virtual char* ReadLength(int position, int length)=0;
virtual char* ReadtoStr(int position, char*)=0;
virtual int FindStr(char*)=0;
virtual bool WritetoFile(int position, char*, int)=0;
};
extern "C"class CStreamFile :public CStreamFile_pub
{

void clearVec();
public:
CStreamFile();
void setFileName(char* fName);
int getFileSize();
char* ReadtoEnd(int position);
char* ReadLength(int position, int length);
char* ReadtoStr(int position, char*);
int FindStr(char*);
bool WritetoFile(int position, char*, int);
~CStreamFile();
};
#endif


这里需要注意的是extern "C",我们必须使用该声明保证函数名称不被改变!!!!,当然还需要自己实现CStreamFile的成员函数,在此不再列出

导出函数如下:

extern "C" __declspec(dllexport)  CStreamFile_pub*getStreamPointer()
{
return new CStreamFile();
}

然后,我们在客户端进行调用即可

#include<Windows.h>
#include<iostream>
using namespace std;
class
CStreamFile_pub{
protected:
void* ptr;
char* pFileName;
public:
virtual void setFileName(char* fName) = 0;
virtual int getFileSize() = 0;
virtual char* ReadtoEnd(int position) = 0;
virtual char* ReadLength(int position, int length) = 0;
virtual char* ReadtoStr(int position, char*) = 0;
virtual int FindStr(char*) = 0;
virtual bool WritetoFile(int position, char*, int) = 0;
};
typedef CStreamFile_pub* (getStreamPointer)();
int main()
{
HANDLE hLib=LoadLibraryA("D:\\Library\\FILE_STREAM\\stream_file\\CStreamFile\\Debug\\CStreamFile.dll");
getStreamPointer* mm = (getStreamPointer*)GetProcAddress((HMODULE)hLib, "getStreamPointer");
int a = 0;
if (NULL == mm)
{
a = GetLastError();
}
CStreamFile_pub* hInst = mm();
hInst->setFileName("D:\\摘要翻译.txt");
int siz = hInst->getFileSize();
}


这样就可以实现dll的导出类的使用了!!!!!


举报

相关推荐

0 条评论