dll的编写和使用
备忘:
1-1: def方式创建:VC6找不到stdafx.h,所以创建空工程,stdafx 里面功能太高端,不用不影响。DLL工程建立好后,新建一CPP文件,叫dlltest.cpp,直接去copy一个DLLMAIN复制进去,有警告就田间#include<windows.h> DllMain下直接写要定义的函数。如 int add(int a,int b){return(a+b);}。去工程目录,新建记事本文档,命名dlltest.def。打开,输入内容.LIBRARY "dlltest",EXPORTS add@1(把所有要导出的都写上,序号依次1,2,3,4……).。保存,这一步非常重要,保存后在工程中sours file栏中点击添加文件,浏览找到dlltest.def。接下来,编译,链接,千万不要一边写一边链接,那样DLL改起来太麻烦。不小心生成了DLL,不想要了就把刚刚编译和链接的过程中生成的文件,能删了都删掉,在重新编译,链接。
1-2: def方式创建后的使用:workstation 中添加新的工程,win32 console app(忘了怎么写,关键字自己去查,任何参考资料都有,我写的操作都是象形)。设置成ACTIVE模式,右击设置。 好了在创建一个call.cpp. 输入 #pragma comment (lib,"dllset.lib"),_declspec (dllimport) int add(int a,int b)把dllset.lib和dlltest.dll拷贝靠该工程目录,然后像是正常调用函数一样使用就行了。int sum = add(10,10); printf (10+10=20),yeah!!!!!!!这叫动态使用,拿过来就用的意思。程序跑起来自动就用,用完自己程序自己释放空间等。
2-1: Export模式创建:老规矩:VC6找不到stdafx.h,所以创建空工程,stdafx里面功能太高端,不用不影响。DLL工程建立好后,新建一CPP文件,叫dlltest.cpp,直接去copy一个DLLMAIN复制进去,有警告就田间#include《windows.h》DLLMAIN下直接写要定义的函数。如 int add(int a,int b){return(a+b);}。添加一个codll.h在里面输入:#pragma once (lib,"路径名+文件名(双反斜杠显示)") extern “C”_declspec (dllexport) int add(int a,int b); add就被卖了,就是声明可以被大家调用啦。
2-2:使用:workstation 中添加新的工程,win32 console app(同上例)。设置成ACTIVE模式,右击设置。 好了在创建一个call.cpp. 输入 #progma comment (lib,"dllset.lib"),extern “C”_declspec(dllimport)把dllset.lib和dlltest.dll拷贝靠该工程目录下,add被买了回来。用法同上。
下面是显式调用过程概述,创建一个可以 指向 add的函数指针 P。用 Loadlibrary (DLL路径+文件名)获得返回句柄。用P实例一个对象 startAdress 使用 GetProcAdress (句柄,函数名字)获得起始地址,int i = 起始地址就是调用ADD,最后释放资源Free (句柄)。\
补充其他说明:
1.隐式链接——静态调用
隐式链接就是在程序开始执行时就将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"Dlltest.h"
void main()
{
int a;
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既可。(注:def创建的dll文件可以供给
2.显式链接 ——动态调用
显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。
void main(void)
{
typedef int(*pMax)(int a,int b);
typedef int(*pMin)(int a,int b);
HINSTANCE hDLL;
PMax MaxHDLL=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系统目录下。
dll的编写和使用的更多相关文章
- [DLL] Dynamic link library (dll) 的编写和使用教程
前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容 ...
- .dll 文件编写和使用
1.基本概念 dll(dynamic-link library),动态链接库,是微软实现共享函数库的一种方式.动态链接,就是把一些常用的函数代码制作成dll文件,当某个程序调用到dll中的某个函数的时 ...
- 动态链接库(DLL)编写经验
我首先说明DLL的生成方法,之后再补充一些特殊之处. 生成方法: 1.对需要导出的类,在头文件中添加 #ifdef CLASS _API #define CLASS_API _declspec(dll ...
- Dll的编写 在unity中加载
1. 在VS中新建Dll项目 2.在头文件中对函数进行声明 extern "C" int _declspec(dllexport) testunity(); 3.在源文件中写函数体 ...
- DLL编写中extern “C”和__stdcall的作用
动态链接库的使用有两种方式,一种是显式调用.一种是隐式调用. (1) 显式调用:使用LoadLibrary载入动态链接库.使用GetProcAddress获取某函数地址. (2) ...
- c调用c++编的dll,c++调用c编写的dll,extern “C”的用法
转自:http://blog.csdn.net/life_is_too_hard/article/details/52137271 c和c++不能直接相互调用,主要是因为c++有重载函数的功能,为了区 ...
- DLL DEF文件编写方法 VC++ 调用、调试DLL的方法 显式(静态)调用、隐式(动态)调用
DLL 文件编写方法: 1.建立DLL工程 2.声明.定义要导出的函数 BOOL WINAPI InitDlg( HWND hTabctrl,TShareMem* pTshare,CRect* prc ...
- Delphi 编写DLL动态链接库文件的知识
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
- DLL编写与调用全解
DLL编写与调用全解 DELPHI学习 2008-12-23 22:52 阅读8 评论0 字号: 大 中 小 第一章 为什么要使用动态链接库(DLL) top 提起DLL您一定不会 ...
随机推荐
- Head中的标签
Head中的其它一些用法 1.scheme (方案) 说明:scheme can be used when name is used to specify how the value of conte ...
- ilbc编解码
针对国内的博客或者技术论坛对 ILBC的论述都是把文章抄来抄去, 本人在此对 ILBC的具体代码实现详细列出代码. ILBC是由Global IP Sound公司提出的一种专为包交换网络通信设计的编解 ...
- 一种比较少见的C#代码段
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- ECMAScript 6教程 (三) Class和Module(类和模块)
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文连接,博客地址为 http://www.cnblogs.com/jasonnode/ .该系列课程是 ...
- ASP.NET WEBAPI 简单CURD综合测试(asp.net MVC,json.net,sql基础存储过程和视图,sqlhelper,json解析)
草图 真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正 ...
- SIP协议栈基础笔记
//------------------SIP基础------------------------// SIP是基于UDP的协议 UA(user Agent)用户代理 UAC(client)发起SIP ...
- Auty自动化测试框架第二篇——读取与执行脚本列表
[本文出自天外归云的博客园] 在Auty中的文件结构,lib目录下的read_selection.py和execute_selection.py文件:
- [LeetCode_1] twoSum
LeetCode: 1. twoSum 题目描述 Given an array of integers, return indices of the two numbers such that the ...
- Web Performance Test: 如果使用Plugin过滤Dependent Request
前言 由于Visual Studio的Web Performance Test是基于XML脚本的,留给用户修改测试行为的自由度并不高.因此,Plugin机制就对于实现很多客户化的配置显得很重要. 问题 ...
- Dialog , ProgressDialog , PopWindow 区别
本质区别: Dialog:非阻塞对话框,弹出对话框时时,后台还可以做事情,点击背景时,对话框消失 ProgressDialog:带有圆形进度或者条形进度的对话框,一般结合handler使用.任务完成后 ...