如何将动态库(DLL)中的类导出(一)

原创 2007年09月12日 10:05:00
 
如何将动态库(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)导出给EXE
GENERAL_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
 

C++动态库(Dll)的制作,导出类

1、完成类的封装: 如:CMyTestClass类/// CMyTestClass.h头文件中 /**************************************************...
  • bao_bei
  • bao_bei
  • 2016年06月03日 16:24
  • 2239

动态库导出静态库工具(dll2lib.exe)

  • 2011年07月28日 09:35
  • 568KB
  • 下载

C#使用EPPlus.dll动态库在一般处理程序中实现将datatable导出到excel

一、.如何安装EPPLus 1.在Visual Studio的解决方案的引用上右键选择管理NeGet程序包 2.在管理NuGet程序包中搜索EPPlus,点击进行安装,安装后便直接添加到引用了...

Unity中将c#导出DLL动态库

本文只作为参考,个人水平有限,望见谅! C#导出DLL,一开始就想到了将c++代码做成DLL的方法,各种复制粘贴宏定义,于是就找了一下C#导出DLL的一般方法,和后者如出一折,只是更简单一些,这里我...
  • zzmkljd
  • zzmkljd
  • 2016年10月14日 10:44
  • 949

DLL(动态库)导出函数名乱码含义

C++编译时函数名修饰约定规则:       __stdcall调用约定:       1、以"?"标识函数名的开始,后跟函数名;         2、函数名后面以"@@YG"标识参数...
  • solo2k
  • solo2k
  • 2016年01月22日 00:54
  • 663

ACE简介以及ACE_DLL动态库操作类的使用

http://egeho123.blogbus.com/logs/14071965.html 1 引言 接触ACE已经有长一段时间了,但一直来没有应用的实际需求,因此这方面的学习进展一直很慢,到目...

.NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper

.NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper

动态库DLL中类的使用

一、DLL中类的导出 在类名称前增加 _declspec(dllexport)定义,例如: class _declspec(dllexport) CMath{ .... }; 通常使...

如何将程序的执行文件和静态加载动态库放在不同的目录

一般windows程序的exe和dll需要放在同一个目录,静态加载才不会报错,否则需要修改path环境变量,将所有没有和exe放在同一目录的dll的路径加在path环境变量中。 有没有一种方法不去手...

JAVA使用dll动态库

  • 2017年12月09日 10:41
  • 585KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何将动态库(DLL)中的类导出(一)
举报原因:
原因补充:

(最多只允许输入30个字)