如何将动态库(DLL)中的类导出
Ø 开发系统:
Windows 2000 + Service Pack 4
Ø 开发工具:
C++ Builder 6.0 + Service Pack 4
Ø 前言
首先我要感谢所有在CSDN中帮助过我的人,特别是季世平和谢伟! 谢谢你们的帮助与支持!
我想如何写动态库(DLL)就不必多说了吧!!如果这方面还不太了解的话可以在网上找找“BCB 编写 DLL 终极手册”这篇文章,写得很祥细!!
当我会写动态库(DLL)和类的时候我就在想如何在动态库(DLL)中写个类,让程序(EXE)可以像“自己”的类一样调用,这样不就可以隐藏自己写类的代码了吗!但这个想法一直没有实现!后来因为工作的需要所以就慢慢摸索出三种方法来,下面分别介绍给大家!
n
方法
1
:
(
由谢伟提供
)
将类的句柄写成导出函数让EXE调用,要解决的问题就是将这个类的句柄传给EXE即它的HANDLE传出,这种方法比较复杂,要为类的每个成员函数写个导出函数,并且EXE必须加入动态库(DLL)的lib文件!
DLL文件:MainDll.cpp
//---------------------------------------------------------------------------#include <vcl.h>#include <windows.h>#pragma hdrstop#pragma argsused//---------------------------------------------------------------------------int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved){return 1;}//---------------------------------------------------------------------------//这句不要忘记加上! 定义DLL的导出函数#include "MakeDll.h"//---------------------------------------------------------------------------//MakeDll类,相当于平时自己定义的类(一个简单的类)class MakeDll{private:int mNumber;public:MakeDll();int SetNumber(int iValue);void ShowOldValue();void ShowNewValue();};//---------------------------------------------------------------------------//以下是类的定义//---------------------------------------------------------------------------MakeDll::MakeDll(){mNumber = 100;}//---------------------------------------------------------------------------int MakeDll::SetNumber(int iValue){mNumber = iValue;return errOk;}//---------------------------------------------------------------------------void MakeDll::ShowNewValue(){ShowMessage("The NEW Value is: " + IntToStr(mNumber));}//---------------------------------------------------------------------------void MakeDll::ShowOldValue(){ShowMessage("The OLD Value is: " + IntToStr(mNumber));}//---------------------------------------------------------------------------//以上是类的定义//---------------------------------------------------------------------------//---------------------------------------------------------------------------//在DLL内部使用MakeDll类,相当于以前在程序中直接调用自己的类//发布这个函数是为了在应用程序中测试这个函数//----------------------------------------------------------GENERAL_APIEXPORT int TestA(int iValue){MakeDll t1;t1.ShowOldValue();t1.SetNumber(iValue);t1.ShowNewValue();return errOk;}//----------------------------------------------------------//----------------------------------------------------------//下面是为了对外隐藏你的类的定义而提供的接口//----------------------------------------------------------//将类的句柄(HANDLE)导出给EXEGENERAL_APIEXPORT HANDLE InitMakeDll(){MakeDll *t1;t1 = new MakeDll;return HANDLE(t1);}//---------------------------------------------------------------------------//原来使用TestA的地方改为使用这个函数//EXE将在上面函数得到的类句柄(HANDLE)传入GENERAL_APIEXPORT int TestB(HANDLE hMakeDll,int iValue){MakeDll *t1;//将类句柄转换成类指针t1 = (MakeDll *)hMakeDll;t1->ShowOldValue();t1->SetNumber(iValue);t1->ShowNewValue();return errOk;}//---------------------------------------------------------------------------//一定不要忘了提供一个类释放函数GENERAL_APIEXPORT int ReleaseMakeDll(HANDLE hMakeDll){MakeDll *t1;t1 = (MakeDll *)hMakeDll;delete t1;return errOk;}//---------------------------------------------------------------------------DLL文件:MakeDll.h//这个文件你可以自己使用,也可以发布给要使用你的DLL的人//在这个头文件里不会暴露任何你的有关类的定义#ifndef H_Peripheral#define H_Peripheral//----------------------------------------------------------------------#define GENERAL_APIEXPORT extern "C" __declspec(dllexport)#define GENERAL_APIIMPORT extern "C" __declspec(dllimport)//----------------------------------------------------------------------static int errOk = 0;static int errWrong = 1;//----------------------------------------------------------------------GENERAL_APIIMPORT int TestA(int iValue); //导出测试函数GENERAL_APIIMPORT HANDLE InitMakeDll() ; //导出类句柄GENERAL_APIIMPORT int TestB(HANDLE hMakeDll,int iValue); //导出类在成员函数GENERAL_APIIMPORT int ReleaseMakeDll(HANDLE hMakeDll); //导出释放函数//----------------------------------------------------------------------#endif