VC中使用动态链接库DLL:静态调用和动态调用

VS2017环境下动态链接库编写及调用 最近项目中有用到DLL,于是就去了解了一下动态链接库DLL)以及基本的的编写方法。先来区分一下静态动态库静态库 window下是 .lib格式 linux下是 .a格式编译期引入到程序代码 -l 动态库 window下是 .dll格式 linux下是 .so格式运行时候进行链接 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是... 阅读详情

VC中生成DLL的办法见:
www.codeproject.com/KB/DLL/RegDLL.aspx

VC中使用DLL
http://www.cnblogs.com/c1230v/articles/1401448.html

调用DLL有两种方法:静态调用和动态调用.
(一).静态调用其步骤如下:
1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;
2.把你的youApp.lib拷到你目标工程(需调用youApp.DLL的工程)目录下;
3.把你的youApp.h(包含输出函数的定义)拷到你目标工程(需调用youApp.DLL的工程)目录下;
4.打开你的目标工程选中工程,选择Visual C++的Project主菜单的Settings菜单;
5.执行第4步后,VC将会弹出一个对话框,在对话框的多页显示控件中选择Link页。然后在Object/library modules输入框中输入:youApp.lib
6.选择你的目标工程Head Files加入:youApp.h文件;
7.最后在你目标工程(*.cpp,需要调用DLL中的函数)中包含你的:#include "youApp.h"
注:youApp是你DLL的工程名。

(二).动态调用其程序如下:
动态调用时只需做静态调用步骤1.

{
    HINSTANCEhDllInst=LoadLibrary("youApp.DLL");
    if(hDllInst)
    {
        typedefDWORD (WINAPI*MYFUNC)(DWORD,DWORD);
        MYFUNCyouFuntionNameAlias=NULL;
        // youFuntionNameAlias 函数别名
        youFuntionNameAlias= (MYFUNC)GetProcAddress(hDllInst,"youFuntionName");
        // youFuntionName 在DLL中声明的函数名
        if(youFuntionNameAlias)
        {
            youFuntionNameAlias(param1,param2);
        }
        FreeLibrary(hDllInst);
    }
}
显式(静态)调用:
LIB + DLL + .H,注意.H中dllexport改为dllimport
隐式(动态)调用:
DLL + 函数原型声明,先LoadLibrary,再GetProcAddress(即找到DLL中函数的地址),不用后FreeLibrary

--------------------------------------
动态链接库DLL的链接
http://blog.donews.com/mmycly/archive/2006/06/15/917076.aspx

应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C++6.0在VC\bin目录下提供了一个名为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) intMax(inta,int b);
extern"C"_declspec(dllimport) intMin(inta,int b);
//TestDll.cpp
#include
#include"Dlltest.h"
void main()
{
    inta;
    a=min(8,10)
    printf("比较的结果为%d\n",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既可。

编程时用ad.h,ad.lib,放在项目当前目录里
在头文件中加入#include "ad.h"
在Project Setting–>Link–>Object/library modules加入ad.lib
执行时将ad.dll跟你的程序放在同一目录

(二).显式链接
显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。

#include
#include
void main(void)
{
    typedefint(*pMax)(inta,int b);
    typedefint(*pMin)(inta,int b);
    HINSTANCEhDLL;
    PMaxMax
    HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
    Max=(pMax)GetProcAddress(hDLL,"Max");
    A=Max(5,8);
    Printf("比较的结果为%d\n",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中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。


 

VC6.0如何创建以及调用动态链接库具体实例 这边博客主要介绍技术的应用而不在细究原理。因为公司项目着急,出结果要紧,并且咱也不是专注搞研究的,所以,基本懂了原理后,直接上手工作,搞出demo来最好。 至于公司工作情况,今天暂且略过,当然也不是一两句能够表达清楚的。后面会有相应的工作总结,敬请期待…… 现在,废话少说,直奔主题——VC6.0中创建动态链接库。 作为客户与后台的中介,为了更好的调节两方的关系,我明智滴选择了we 阅读详情

相关推荐

VC创建并使用DLL

为何DLL先看看静态库与DLL的不同之处可执行文件的生成(Link期):前者很慢(因为要将库中的所有符号定义Link到EXE文件中),而后者很快(因为后者被Link的引入库文件无符号定义)可执行文件的大小:前者很大,后者很小(加上DLL的大小就前者差不多了)可执行文件的运行速度:前者快(直接在EXE模块的内存中查找符号),后者慢(需要在DLL模块的内存中查找,在另一个模块的内存中查找自然较慢)可

8940

VC++创建调用dll+静态调用动态调用

在工程应用中,动态链接库dll)的重要性灵活性是不言而喻的,这里将介绍一种最基本的创建调用dll的方法,下面是使用VC++6.0的实现过程: 1. 创建dll 如上图所示,选择Win32 Dynamic-Link Library,创建名为dllTest的空工程;在该工程项下分别添加.cpp.h文件(其名称分别为dllTest.cppdllTest.h),在.h项下添加代码: extern "C" _declspec(dllexport) void Test(int a,int b); ...

翻肚鱼儿的博客 718

动态链接库编写与使用VC6)

静态链接库编写与使用静态链接相比,动态链接更灵活,修改动态链接库的代码不需要重新编译exe程序,如果说静态链接库是编译阶段的模块化,那么动态链接就是真正的运行时模块化。 下面将演示使用VC6编写动态链接库dll),然后在另一个程序中链接使用。 一、创建动态链接库工程 选择WIN32动态链接库 simple DLL project 二、编写代码 创建头文件CPP文件,分别用于声明定义函数 MyDll.h #if !defined(AFX_MYDLL_H__EF374ACC_12D5_44C8_A5

hambaga的博客 1233

vc调用动态链接库DLL静态链接库Lib的四种方法

方法一:windows提供了一套函数,用于加载动态链接库中的符号(函数变量),调用这些函数去加载:   1. HINSTANCE LoadLibrary( LPCTSTR lpLibFileName);   2. FARPROC GetProcAddress( HMODULE hModule, LPCWSTR lpProcName);   3. BOOL FreeLibrary( HMOD

自然语言处理及大数据 4108

C++创建动态链接库(.dll),并分别通过C++调用以及C#调用

注意你的平台是X64还是X86的,最引用.dll文件的时候,平台必须与生成dll文件的平台一致,我生成.dll文件的平台是X64,那在引用的时候也必须是X64平台。1、在VS项目中,分别创建.h文件.cpp文件,其中,.h文件用于声明方法,.cpp文件用于编写与方法对应的函数内容。3、最后你就可以在你自己的项目文件路径-X64-Debug中看到.dll文件.lib文件了。1、注意自己的平台是哪一个,必须将平台属性与.dll文件的平台属性调为一致。将.dll文件.lib文件复制到lib文件夹中。

qq_42655403的博客 1035

VC调用动态库文件Dll

对于没有这样编程的友友们,这是一个简单的实例,可能有一定的帮助: 一、创建动态链接库(MFC规则DLL)        1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL //取名为MFC_dll   2. def文件中添加:函数名(Add_new)   3. h文件中添加:外部函数声明//求

haizimin的专栏 1572

c语言怎么调用dll文件

from:http://zhidao.baidu.com/question/479621352.html   dll调用: (1)一般动态链接库有头文件声明h文件,lib,dll;这三个文件都用;使用的时候需要引用的文件中加上#pragma comment (lib, "xxx.lib")就可以,然后可以调用dll里面函数等 (2)如果只有lib,h文件,那这是静态链接库,同上面一样 (

zyflying的专栏 1万+

MFC三大dll使用总结

DLL指的是动态链接库(Dynamic Link Library),它是一个可以被多个应用程序(甚至是不同语言编写的应用程序)同时调用的可执行二进制文件,是一个可共享的库。DLL是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数数据被存储在一个DLL(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的DLL。显然,DLLVC职业程序员的必修课,因为在

zhu3522728的专栏 2074

Qt6之调用Windows下vc生成的动态链接库dll

无论采用哪种方法编译,最终都会生成dll文件lib文件 (导入库文件)。

yanchenyu365的博客 6401

动态库DLL文件的动态调用静态调用

参考百度百科C++调用DLL有两种方法—静态调用&动态调用 库文件一般指计算机上的一类文件,分两种,一种是静态库,另一种是动态库DLL(Dynamic Link Library)文件,又叫动态链接库文件。静态动态库的区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存,而且使用动态库也便于模块化更新程序。 一

weixin_42579072的博客 2491

调用静态链接库动态链接库

调用静态链接库 静态链接库由.h.lib文件组成,.h文件在工程中用来声明,而.lib文件包含供外界调用的函数的原型。   VC 6.0中调用静态链接库.lib共3种方法: 1.首先使用语句#include "lib.h",并将lib.h拷贝到当前工程目录下;    接着对staticlib_smp.lib使用语句 #pragma comment(lib,"***\\staticlib

UESTC的专栏 3713

(转贴)VC中创建与使用静态链接库动态链接库

 关键词: VC    静态链接库    动态链接库                                           静态库包括.lib.h文件,在工程中使用静态库分为3步:1在工程中加入静态库,有两种方法:方法一:项目设置中引用.lib,project-setting-link-object/library modules中添加.lib;(需要在tools/

immortal_06的专栏 4635

在DelphiVC中创建调用动态链接库 (转)

大家在软件开发时经常会遇到这样的情况,在不同的开发环境中为实现一些功能相同的过程,由于开发所使用的设计语言不同,因而不得不编写许多类似的代码,甚至有时要在同一个开发环境不同项目中重写代码,这就造成了很大的资源浪费。动态链接库能较好的解决这个问题,重复利用代码将大大提高了开发效率。一般,用户在应用程序中基于如下要求创建使用DLL:  1. 在不同的可执行文件之间共享的程序;  2. 在设计应用程序

ych1的专栏 2533

vc 动态链接库静态链接库

1背景软件开发基于模块化开发的理念,可以提高代码重用性、便于模块的测试模块功能的维护扩充、缩短开发周期。模块化开发在设计上的体现是模块功能的划分模块之间内聚性、耦合性的设计。在开发技术上的体现主要是动态链接库静态链接库的设计。因为设计上功能需要开发的项目密切联系,本文不加讨论。本文主要介绍在开发技术上的体现:即介绍动态链接库静态链接库。2概念区别不论是动态链接库

littlening的专栏 3364

动态链接库VC++2010中创建使用动态链接库dll

一、动态链接库简介 动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码数据的库 ,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于 一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据

Stay hungry, Stay foolish! 1万+

vc dll编译调用

关于VC中的DLL的编程[1]这一节介绍Non-MFC DLLs的编写方法。下面是一个通用的写法:BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch( ul_reason_for_call ) {case DLL_PROCESS_ATTACH:.......case DLL_

shiyiytt的专栏 2379

VB与VC动态链接库的高效调用与实现

VB(Visual Basic)VC(Visual C++)是微软公司推出的两个开发工具,它们在编程语言应用场景方面各有侧重。VB是一种面向对象的编程语言,以其简洁易学的特点著称,主要用于快速开发Windows应用程序。而VC,也就是Visual C++,则更侧重于系统级性能要求较高的应用开发,支持CC++语言,提供更深层次的系统控制能力。动态链接库(Dynamic Link Library,简称DLL)是微软Windows操作系统中实现共享函数库的一种方式。

weixin_33608403的博客 806
上一篇: vc 字体的创建
下一篇: 变体类型Variant
HiRuyue
博客等级 码龄14年 47粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值