中调用DLL中的函数,VC中创建DLL动态连接库的方法
分类:web前端

前几日教大家在VC中创建DLL文件的章程步骤,一齐来学学一下,并非很难的,相信聪明的你一看就能够。

转自:  

 

  一.Win32动态链接库

应用程序使用DLL能够行使三种艺术:

  1. 成立项目

  1.创设的步子:

一种是隐式链接,另一种是显式链接。在行使DLL从前率先要明了DLL中等学园函授数的协会消息。

图片 1

  (1卡塔尔新建WIN32 Dynamic-link Library工程,工程名字为MyDll,选取A simple DLL project类型。

Visual C++6.0在VCbin目录下提供了叁个名称为Dumpbin.exe的小程序,用它能够查看DLL文件中的函数构造。此外,Windows系统将国有国法上面包车型的士找寻顺序来定位DLL:

 

  (2State of QatarMyDll.h的从头到尾的经过如下:

1.包罗EXE文件的目录,

图片 2

以下是引用片段:
  extern "C" _declspec(dllexport) int sum(int a,int b);//本文所有的例子只有一个sum即加法函数。

2.进度的当前工作目录,

图片 3

  (3卡塔尔(قطر‎MyDll.cpp的内容如下:

3.Windows系统索引,

  1. 编写制定最轻易易行的代码如下
以下是引用片段:
  #include "stdafx.h"
  #include "windows.h"
  #include "MyDll.h"
  BOOL APIENTRY DllMain(
  HANDLE hModule,
  DWORD ul_reason_for_call,
  LPVOID lpReserved
  )
  {
  return TRUE;
  }
  extern "C" _declspec(dllexport)int sum(int a, int b)
  {
  return a+b;
  }

4.Windows目录,

// Test.cpp : Defines the entry point for the DLL application.
//

  (4State of Qatar编写翻译之后发生了MyDll.lib与MyDll.dll八个公文。

5.列在Path境况变量中的一多元目录。

#include "stdafx.h"

  2.行使办法:

1.隐式链接

extern "C" __declspec(dllexport)  int __stdcall Math(int,intState of Qatar; //声美赞臣(Meadjohnson卡塔尔(قطر‎个能够导出的秘诀

  (1卡塔尔.隐式调用法: 将MyDll.lib和MyDll.h拷贝到须要利用该DLL的工程的目录下,将MyDll.dll拷贝到产生的应用程序的目录下,并在须要运用该DLL中的函数的CPP文件中加多如下几行:

  隐式链接正是在程序开头进行时就将DLL文件加载到应用程序此中。达成隐式链接超级轻巧,只要将导入函数关键字_declspec(dllimport卡塔尔函数名等写到应用程序相应的头文件中就能够了。

//那是其余七个dll的入口点
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

以下是引用片段:
  #include "MyDll.h"
  #pragma comment(lib,"MyDll");

隐式链接接受静态加载的措施,比较简单,供给.h、.lib、.dll三件套。新建“调控台应用程序”或“空项目”。配置如下:

int  __stdcall Math(int a,int b)
{
    return a+b;
}

  (2卡塔尔.凸显调用法:将MyDll.lib和MyDll.h拷贝到须求接纳该DLL的工程的目录下,将MyDll.dll拷贝到发生的应用程序的目录下,并在需求选拔该DLL中的函数的CPP文件中隐含头文件,如:

品类->属性->配置属性->VC++ 目录-> 在“包蕴目录”里增加头文件Mydll.h所在的目录  项目->属性->配置属性->VC++ 目录-> 在“库目录”里增添头文件Mydll.lib所在的目录  项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里拉长“Mydll.lib”(若有多少个 lib 则以空格隔绝) 上边包车型客车事例通过隐式链接调用MyDll.dll库中的Min函数。首学子成叁个档案的次序为testDLL,在testDLL.h、testDLL.cpp文件中分别输入如下代码:

 

以下是引用片段:
  #include "MyDll.h"

 //testDLL.h

 

  同期还亟需在Project->Setting->Link->Object/library modules的框中扩大MyDll.lib这几个库。

图片 4

  1. F7键,编译的结果如下

  二.MFC动态链接库

#pragma comment(lib,"MyDll.lib") extern "C"_declspec(dllimport) int Max(int a,int b); extern "C"_declspec(dllimport) int Min(int a,int b); //TestDll.cpp #include #include"Dlltest.h" void main(卡塔尔(قطر‎ {int a; a=min(8,10)printf("比较的结果为%dn",a); }

图片 5

  1.制作的步调:

图片 6

  1. 将该dll复制到c:windowssystem32中去

  (1卡塔尔国新建MFC AppWizard(dll卡塔尔工程,工程名称叫MFCDll,接纳Regular DLL using shared MFC DLL类型。

 在开创DllTest.exe文件在此以前,要先将MyDLL.dll和MyDLL.lib拷贝到当前工程可实施文件所在的目录上面(非常关键),也能够拷贝到windows的System**目录下**。假设DLL使用的是def文件,要删减testDLL.h文件中根本字extern "C"。testDLL.h文件中的关键字Progam commit是要Visual C+的编写翻译器在link时,链接到MyDll.lib文件,当然,开采职员也足以不接收#pragma comment(lib,"MyDLL.lib"卡塔尔国语句,而一贯在工程的Setting->Link页的Object/Moduls栏填入MyDll.lib既可。

图片 7

  (2卡塔尔国在改造的MFCDll.cpp文件前面扩大下边几行:

2.显式链接

 

以下是引用片段:
  int sum(int a, int b)
  {
  return a+b;
  }

  显式链接是应用程序在举行进度中时时能够加载DLL文件,也得以每一日卸载DLL文件,这是隐式链接所不可能作到的,所以显式链接具有越来越好的圆滑,对于解释性语言更是合适。可是完毕显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将本人所做的动态链接库调进来,动态链接库的文件名就是上述五个函数的参数,自此再用GetProcAddress(State of Qatar获取想要引进的函数。今后,你就能够象使用就像在应用程序自定义的函数同样来调用此引进函数了。在应用程序退出从前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。上面是经过显式链接调用DLL中的Max函数的事例。

  1. 然后,编写叁个轻松的.NET Console程序,来调用该函数

  (3State of Qatar在扭转的MFCDll.def文件前边扩充如下:

 #include

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

以下是引用片段:
  sum @1 ;表示第一个函数是sum

图片 8

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("Test.dll")]
        public static extern int Math(int a, int b);

  (4State of Qatar编写翻译后会爆发五个文本MFCDll.lib,MFCDll.dll

#include void main(void) { typedef int(*pMax)(int a,int b); typedef int(*pMinState of Qatar(int a,int bState of Qatar; HINSTANCE hDLL; PMax Max HDLL=LoadLibrary("MyDll.dll"卡塔尔;//加载动态链接库MyDll.dll文件; Max=(pMax卡塔尔GetProcAddress(hDLL,"Max"State of Qatar; A=马克斯(5,8State of Qatar; Printf("相比的结果为%dn",a); FreeLibrary(hDLL);//卸载MyDll.dll文件; }

        static void Main(string[] args)
        {
            Console.WriteLine(Math(20, 30));
            Console.Read();
        }
    }
}

  2.用到情势

图片 9

运行调整之后,可以见到如下的效果与利益

  (1State of Qatar隐式调用法: 将MFCDll.lib拷贝到需求使用该DLL的工程的目录下,将MyDll.dll拷贝到发出的应用程序的目录下,并在需求采取该DLL中的函数的CPP文件中加多如下几行:

 

图片 10

  //注意这里未有在MFCDll.h中宣称函数,所以不可能直接包罗MFCDll.h来声称函数。

 

【备注】这几个dll也足以一向放在.NET程序的根目录

以下是引用片段:
  #pragma comment(lib,"MFCDll");
  int sum(int a, int b);

 

如此,大家就落到实处了在.NET里面临它的调用。

  //当然倘让你的DLL中有为数不菲函数,这能够别的写个MFCDll.h,包涵全部的函数评释,然后直接将头文件包罗进去

 

 

  (2卡塔尔显示调用法:与Win32的调用方法一致,没有供给#pragma comment(lib,"MFCDll"卡塔尔国;,可是急需在Project->Setting->Link->Object/library modules的框中增添MFCDll.lib这几个库。

在上例中接受类型定义关键字typedef,定义指向和DLL中同样的函数原型指针,然后经过LoadLibray(卡塔尔(قطر‎将DLL加载到当前的应用程序中并回到当前DLL文件的句柄,然后经过GetProcAddress(State of Qatar函数获取导入到应用程序中的函数指针,函数调用完毕后,使用FreeLibrary(卡塔尔(قطر‎卸载DLL文件。在编写翻译程序早先,首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。

  1. 小编们再来看一下,如何在VB等历史观程序中调用它

 

Declare Function Math Lib "Test" (ByVal a As Integer, ByVal b As Integer) As Integer

  使用显式链接应用程序编译时无需采纳相应的Lib文件。此外,使用GetProcAddress(卡塔尔(قطر‎函数时,能够选拔MAKEINTRESOURCE(卡塔尔(قطر‎函数直接接收DLL中等学园函授数出现的顺序号,如将GetProcAddress(hDLL,"Min"卡塔尔国改为GetProcAddress(hDLL, MAKEINTRESOURCE(2卡塔尔国卡塔尔(قطر‎(函数Min(卡塔尔国在DLL中的顺序号是2),那样调用DLL中的函数速度十分的快,可是要铭记在心函数的施用序号,不然会时有爆发错误。

Public Sub Test()
Msgbox(Math(20, 30))
End Sub

图片 11

但要确认保证VB能调用成功,必得增加一个后缀名称为def的文本,内容正是两句话

图片 12

除非那样才得以

 

7.末尾,大家还要看一下,如何在其他的C++程序中应用它呢?

上面这段摘自: 

  动态链接库DLL的链接
  应用程序使用DLL可以应用二种办法:一种是隐式链接,另一种是显式链接。在接受DLL在此以前率先要知道DLL中等学园函授数的布局音信。Visual C++6.0在VCbin目录下提供了多个名称叫Dumpbin.exe的小程序,用它能够查阅DLL文件中的函数布局。其余,Windows系统将依据上边包车型地铁索求顺序来定位DLL: 1.包括EXE文件的目录,2.进程的当前事业目录, 3.Windows系统索引, 4.Windows目录,5.列在Path蒙受变量中的一多种目录。
  (一)隐式链接
  隐式链接正是在前后相继带头试行时就将DLL文件加载到应用程序当中。达成隐式链接相当的轻便,只要将导入函数关键字_declspec(dllimport卡塔尔(قطر‎函数名等写到应用程序相应的头文件中就可以了。上边包车型大巴例子通过隐式链接调用MyDll.dll库中的Min函数。首士人成一个品种为TestDll,在DllTest.h、DllTest.cpp文件中分别输入如下代码:

//Dlltest.h
#pragma comment(lib,"MyDll.lib")
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
//TestDll.cpp
#include<stdio.h>
#include"Dlltest.h"
void main()
{
 int a;
 a=min(8,10)
 printf("比较的结果为%dn",a);
}

  在成立DllTest.exe文件在此以前,要先将MyDll.dll和MyDll.lib拷贝到方今工程所在的目录上边,也得以拷贝到windows的System目录下。假如DLL使用的是def文件,要去除TestDll.h文件中最重要字extern "C"。TestDll.h文件中的关键字Progam commit是要Visual C+的编写翻译器在link时,链接到MyDll.lib文件,当然,开垦人士也足以不采纳#pragma comment(lib,"MyDll.lib"卡塔尔国语句,而直白在工程的Setting->Link页的Object/Moduls栏填入MyDll.lib既可。
  (二)显式链接
  显式链接是应用程序在施行进程中随即能够加载DLL文件,也足以每一日卸载DLL文件,那是隐式链接所不可能作到的,所以显式链接具备更加好的面面俱到,对于解释性语言更是方便。不过完毕显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将协和所做的动态链接库调进来,动态链接库的文件名便是上述五个函数的参数,从此以后再用GetProcAddress(卡塔尔(قطر‎获取想要引入的函数。自此,你就能够象使用就如在应用程序自定义的函数相像来调用此引进函数了。在应用程序退出以前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下边是经过显式链接调用DLL中的Max函数的例子。

#include <studio.h>
#include<widows.h>
void main(void)
{
 typedef int(*pMax)(int a,int b);
 typedef int(*pMin)(int a,int b);
 HINSTANCE hDLL;
 PMax Max
 HDLL=LoadLibrary("MyDll.dll"卡塔尔;//加载动态链接库MyDll.dll文件;
 Max=(pMax)GetProcAddress(hDLL,"Max");
 A=Max(5,8);
 Printf("相比较的结果为%dn",a);
 FreeLibrary(hDLL);//卸载MyDll.dll文件;
}

  在上例中应用类型定义关键字typedef,定义指向和DLL中一样的函数原型指针,然后通过LoadLibray(卡塔尔(قطر‎将DLL加载到当下的应用程序中并再次来到当前DLL文件的句柄,然后通过GetProcAddress(卡塔尔(قطر‎函数获取导入到应用程序中的函数指针,函数调用完成后,使用FreeLibrary(卡塔尔国卸载DLL文件。在编写翻译程序以前,首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。
  使用显式链接应用程序编写翻译时无需动用相应的Lib文件。此外,使用GetProcAddress(卡塔尔函数时,能够应用MAKEINTRESOURCE(卡塔尔(قطر‎函数直接使用DLL中等学园函授数出现的顺序号,如将GetProcAddress(hDLL,"Min"卡塔尔国改为GetProcAddress(hDLL, MAKEINTRESOURCE(2卡塔尔国卡塔尔(函数Min(卡塔尔(قطر‎在DLL中的顺序号是2),那样调用DLL中的函数速度迅猛,不过要铭记在心函数的行使序号,不然会产生错误。

本文由10bet手机官网发布于web前端,转载请注明出处:中调用DLL中的函数,VC中创建DLL动态连接库的方法

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文