关闭

DLL导出函数

标签: dll应用
251人阅读 评论(0) 收藏 举报
分类:

DLL的链接方式分为两种:隐式链接和显式链接

DLL导出的函数 和 导出类在调用时,有些区别,这里暂时不讲,直说简单的导出函数;


隐式链接:


#include "stdafx.h"
#include "MathDLL.h"

#pragma comment(lib, "MathDLL.lib") //你也可以在项目属性中设置库的链接

int main()
{
        Add(1,2);
        return(1);
}


显式链接:

在头文件或是包含头文件下面添加函数指针,函数里面两个int类型参数,函数返回值是int类型,如下:

typedef int (*DLLFunc)(int,int);


DLLFunc pAdd;
	HINSTANCE h_Instance = LoadLibrary(_T("MathDLL.dll"));

	if(h_Instance == NULL)
	{
		FreeLibrary(h_Instance);
	}

	pAdd = (DLLFunc)GetProcAddress(h_Instance,("Add"));

	if(pAdd == NULL)
	{
		FreeLibrary(h_Instance);
	}

	int c = pAdd(5,9);
	CString str;
	str.Format(_T("输出加法数字是:%d"),c);

	MessageBox(str,_T("加法算法"));

	FreeLibrary(h_Instance);

我这里测试时创建的MFC的对话框程序,所以不需要包含特殊头文件,如果不是的话,考虑要包含#include "windows.h",同时显式链接不需要包含dll的头文件,

下面是对dll一些解释,这是我从别的文章拿过来的!

一个HINSTANCE是一个Windows数据类型:是一个实例的句柄;在此情况下,这个实例将是这个DLL。你可以通过使用函数LoadLibrary()获得DLL的实例,它获得一个名称作为参数。在调用LoadLibrary函数后,你必需查看一下函数返回是否成功。你可以通过检查HINSTANCE是否等于NULL(在Windows.h中定义为0或Windows.h包含的一个头文件)来查看其是否成功。如果其等于NULL,该句柄将是无效的,并且你必需释放这个库。换句话说,你必需释放DLL获得的内存。如果函数返回成功,你的HINSTANCE就包含了指向DLL的句柄。

一旦你获得了指向DLL的句柄,你现在可以从DLL中重新获得函数。为了这样作,你必须使用函数GetProcAddress(),它将DLL的句柄(你可以使用HINSTANCE)和函数的名称作为参数。你可以让函数指针获得由GetProcAddress()返回的值,同时你必需将GetProcAddress()转换为那个函数定义的函数指针。举个例子,对于Add()函数,你必需将GetProcAddress()转换为AddFunc;这就是它知道参数及返回值的原因。现在,最好先确定函数指针是否等于NULL以及它们拥有DLL的函数。这只是一个简单的if语句;如果其中一个等于NULL,你必需如前所述释放库。

一旦函数指针拥有DLL的函数,你现在就可以使用它们了,但是这里有一个需要注意的地方:你不能使用函数的实际名称;你必需使用函数指针来调用它们。在那以后,所有你需要做的是释放库如此而已。

模块句柄

进程中的每个DLL模块被全局唯一的32字节的HINSTANCE句柄标识。进程自己还有一个HINSTANCE句柄。所有这些模块句柄都只有在特定的进程内部有效,它们代表了DLL或EXE模块在进程虚拟空间中的起始地址。在Win32中,HINSTANCE和HMODULE的值是相同的,这个两种类型可以替换使用。进程模块句柄几乎总是等于0x400000,而DLL模块的加载地址的缺省句柄是0x10000000。如果程序同时使用了几个DLL模块,每一个都会有不同的HINSTANCE值。这是因为在创建DLL文件时指定了不同的基地址,或者是因为加载程序对DLL代码进行了重定位。
模块句柄对于加载资源特别重要。Win32 的FindResource函数中带有一个HINSTANCE参数。EXE和DLL都有其自己的资源。如果应用程序需要来自于DLL的资源,就将此参数指定为DLL的模块句柄。如果需要EXE文件中包含的资源,就指定EXE的模块句柄。
但是在使用这些句柄之前存在一个问题,你怎样得到它们呢?如果需要得到EXE模块句柄,调用带有Null参数的Win32函数GetModuleHandle;如果需要DLL模块句柄,就调用以DLL文件名为参数的Win32函数GetModuleHandle。

应用程序怎样找到DLL文件

如果应用程序使用LoadLibrary显式链接,那么在这个函数的参数中可以指定DLL文件的完整路径。如果不指定路径,或是进行隐式链接,Windows将遵循下面的搜索顺序来定位DLL:
1. 包含EXE文件的目录,
2. 进程的当前工作目录,
3. Windows系统目录,
4. Windows目录,
5. 列在Path环境变量中的一系列目录。
这里有一个很容易发生错误的陷阱。如果你使用VC++进行项目开发,并且为DLL模块专门创建了一个项目,然后将生成的DLL文件拷贝到系统目录下,从应用程序中调用DLL模块。到目前为止,一切正常。接下来对DLL模块做了一些修改后重新生成了新的DLL文件,但你忘记将新的DLL文件拷贝到系统目录下。下一次当你运行应用程序时,它仍加载了老版本的DLL文件,这可要当心!

调试DLL程序

Microsoft 的VC++是开发和测试DLL的有效工具,只需从DLL项目中运行调试程序即可。当你第一次这样操作时,调试程序会向你询问EXE文件的路径。此后每次在调试程序中运行DLL时,调试程序会自动加载该EXE文件。然后该EXE文件用上面的搜索序列发现DLL文件,这意味着你必须设置Path环境变量让其包含DLL文件的磁盘路径,或者也可以将DLL文件拷贝到搜索序列中的目录路径下。
或者当你调试EXE程序时,在Project Setting中,将Debug选项卡中的Category设置为Additional DLLs。就可以同时调试EXE和它调用的DLL(当然,你需要有DLL的源代码)了。


程序运行:



完成

1
0
查看评论

C#直接调用DLL导出函数

示例 1 本示例显示如何使用 DllImport 属性通过调用 msvcrt.dll 中的 puts 输出消息。 // PInvokeTest.cs using System; using System.Runtime.InteropServices; class PlatformInvo...
  • shaoxiaoning
  • shaoxiaoning
  • 2014-08-25 21:28
  • 772

动态链接库DLL的函数导出

1、导出普通函数 为了让DLL导出一些函数,需要在每一个将要被导出的函数前添加标识符:_declspec(dllexport)如: _declspec(dllexport) int add(int a,intb){return a+b;} 编译生成DLL后使用dumpbin查看的到  Or...
  • gd6463
  • gd6463
  • 2014-01-07 17:14
  • 1845

DLL 函数导出的规则和方法

//在编程c++dll时  extern "C"和.def的作用  extern "c"是c++编译器在编译函数时以c编译器的方式处理函数名  而.def的作用也是告知编译器以.def导出的文件名的方式编译函数名 ...
  • xiaominggunchuqu
  • xiaominggunchuqu
  • 2017-06-01 23:54
  • 581

DLL导出类和导出函数

1、动态库DLL中的类或者函数有时候要被其他的库调用,因此需要被其他库调用的类或者函数需要进行导出。 2、首先编写需要导出的DLL,新建一个工程设置应用程序类型为DLL 3、类的代码如下 头文件 #pragma once #define EX_PORT __declspec(dl...
  • goodluckMT
  • goodluckMT
  • 2016-09-28 16:05
  • 3443

VC++  DLL 导出函数

VC++  DLL  导出函数  经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关系。 VC++支持两种语言:即C/C++,这也是造成DLL导出函数差异的根...
  • Tinna_zhang
  • Tinna_zhang
  • 2014-03-12 15:48
  • 7966

关于DLL导出函数的总结

一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解。要学习,这篇文章先总结DLL的导出函数的方法。         首先说一下如何建立DL...
  • xiao_0429
  • xiao_0429
  • 2015-08-12 00:16
  • 6554

C++ 查看dll导出函数

输入如下命令,查看dll导出函数: dumpbin -exports D:\xxx.dll   回车
  • wushuangge
  • wushuangge
  • 2017-08-18 15:07
  • 122

如何生成DLL文件并导出函数及如何在C++或C#中调用DLL中导出的函数

关于DLL的含义和优点,不是本文讨论的重点,这里我们仅讨论如何用C++生成DLL文件,并导出函数。 首先:在VS中创建工程的时候,要选择VC++(我只会用C++来生成DLL文件)语言,然后选择win32再选择win32项目,如下图所示:     ...
  • adi_1987
  • adi_1987
  • 2016-12-05 13:34
  • 1166

关于Dll 导出函数名(ZZ)

http://blog.csdn.net/conanlrj/article/details/5797549 使用Dependency看DLL的导出函数的名字,会发现有一些有意思的东西,这大多是和编译DLL时候指定DLL导出函数的导出符有关系。 ////////////////////////...
  • chenzhisi
  • chenzhisi
  • 2013-12-05 16:10
  • 927

VS中使用dumpbin命令查询dll中的导出函数

(1)使用命令行工具,进入到需要查看的dll所在目录。 (2)在计算机中的VS目录下找到vcvars32.bat,并将其拖入命令行工具。 我的是:E:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin (3)命令行输入: ...
  • guo503604087
  • guo503604087
  • 2015-07-01 19:10
  • 1079
    个人资料
    • 访问:62446次
    • 积分:1219
    • 等级:
    • 排名:千里之外
    • 原创:57篇
    • 转载:32篇
    • 译文:0篇
    • 评论:13条
    文章分类
    最新评论