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您一定不会 ...
随机推荐
- iOS 杂记
一,demo 1,视图跳转 MaryPopin: https://github.com/Backelite/MaryPopin 2,Nimbus是一个开源的iOS框架,比起Three20,Nimbu ...
- JQuery基础一
1.在浏览器点击F12,调出源码设置端点F11进行调试 2.要操作DOM对象,首先要把DOM对象封装成juery对象: jQuery(document).ready(function () { ale ...
- 关于</div>的粗浅理解
</div>作为c#中常用的一个标签,在写多个区域的内容时有着十分重要的作用.如果写简单的网页时不用div可能感受不到太大的影响,但是在写较为复杂的程序时div的分隔作用就很明显了,改动大 ...
- Jmeter函数 唯一取值 笔记
java sample时: result.setIdleTime(毫秒):设置waste time ,jmeter在统计响应时间时会自动减去此函数设置的时间 result.setSuccessful( ...
- Android属性动画完全解析(下)
转载:http://blog.csdn.net/guolin_blog/article/details/44171115 大家好,欢迎继续回到Android属性动画完全解析.在上一篇文章当中我们学习了 ...
- C++文本的读取和写入
#include <iostream> #include <sstream> #include <fstream> #include <string> ...
- logstash filter grok 用法
在elk+filebeat都安装好,且明白了基本流程后,主要的就是写logstash的filter了,以此来解析特定格式的日志 logstash的filter是用插件实现的,grok是其中一个,用来解 ...
- Python3基础 把一个列表中内容给另外一个列表,形成两个独立的列表
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 断言(ASSERT)的用法
我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”. 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解 ...
- 替换 data.frame 中的特殊的值
替换空值: foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", ...