建立WIN32 DLL,并使用静态加载和动态加载
新建工程,选择win32 dll
编写.cpp(或.c)
MyDll.cpp
#include "windows.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)
//extern "C" int sum(int a, int b)
{
return a+b;
}
extern "C"
(1) 被extern限定的函数或变量是extern类型的
如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明externint v 被引用的变量v的链接属性必须是外链接(external)的
(2) 被extern "C"修饰的变量和函数是按照C语言方式编译和连接的
C和C++编译产生的函数名不同,C为_name,C++为_name_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的
可以使用__declspec(dllexport)关键字从 DLL 导出数据、函数、类或类成员函数。
__declspec(dllexport)将导出指令添加到对象文件,若要导出函数,__declspec(dllexport)关键字必须出现在调用约定关键字的左边(如果指定了关键字)。
例如:
__declspec(dllexport) void __cdecl Function1(void);
若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
或者使用def文件告诉编译器不要改函数的名字
可以在这工程里面加一个.h头文件,将要用的函数包含进去,在使用DLL的时候将.h文件拷贝到工程目录下,直接#include进.h,就不用声明函数了。
静态包含DLL
建立win32 console app UseDll
UseDll.c
#include <stdio.h>
#pragma comment(lib,"MFCDll"); //或者在project->set->link里面引入
int sum(int a, int b);//函数声明,若有.h头文件,加入即可
int main()
{
k = sum(1, 2);
printf("%d \n", k);
return 0;
}
将.dll(动态库)放入运行程序目录里,将.lib(引入库)放入工程目录下
动态加载DLL
建立win32 console app UseDll
UseDll.c
#include <stdio.h>
#pragma comment(lib,"MFCDll"); //或者在project->set->link里面引入
int sum(int a, int b);//函数声明,若有.h头文件,加入即可 typedef int (*FUN)( );//指向函数的指针FUN,在C中,空为0或多个参数,C++中...为0或多个参数。指针函数在函数参数中可用int (*)()
FUN fun;
HINSTANCE hInstance; //FARPROC lpFunction;//查看宏可知其为远指针,指向使用_stdcall调用约定(C++默认调用约定,此处加载的DLL为C程序默认使用_cdecl)的函数
int k; int main()
{
hInstance = LoadLibrary("MyDll.dll");
if(!hInstance)
printf("Not Find this Dll \n");
fun = (FUN)GetProcAddress(hInstance, "sum")
if (!fun)
printf("not find this fun \n");
k = fun(1, 2);
printf("%d \n", k);
return 0;
}
建立WIN32 DLL,并使用静态加载和动态加载的更多相关文章
- 动态库DLL加载方式-静态加载和动态加载
静态加载: 如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头文件中 #pragma comment(lib ...
- JAVA反射机制--静态加载与动态加载
Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如pu ...
- 动态链接库dll的 静态加载 与 动态加载
dll 两种链接方式 : 动态链接和静态链接(链接亦称加载) 动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统 ...
- [转载] 动态链接库dll的 静态加载 与 动态加载
转载自:http://blog.csdn.net/youxin2012/article/details/11538491 dll 两种链接方式 : 动态链接和静态链接(链接亦称加载) 动态链接是 ...
- JAVA类的静态加载和动态加载以及NoClassDefFoundError和ClassNotFoundException
我们都知道Java初始化一个类的时候可以用new 操作符来初始化, 也可通过Class.forName()的方式来得到一个Class类型的实例,然后通过这个Class类型的实例的newInstance ...
- 使用js加载器动态加载外部Javascript文件
原文:http://www.cnblogs.com/xdp-gacl/p/3927417.html 今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下: JsLoader.js var ...
- Lodop 动态加载模板,动态加载数据
最近需要使用Lodop打印控件,所以就研究了一下,期间从网上找了诸多的东西,基本全是对HTML进行打印的,没有找到我想要的,就只好自己动手丰衣足食. 这篇文章主要讲述的是Lodop与数据的结合使用,官 ...
- JavaScript学习总结(十九)——使用js加载器动态加载外部Javascript文件
今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下: JsLoader.js 1 var MiniSite=new Object(); 2 /** 3 * 判断浏览器 4 */ 5 M ...
- 使用js加载器动态加载外部js、css文件
let MiniSite = new Object(); /** * 判断浏览器 */ MiniSite.Browser = { ie: /msie/.test(window.navigator.us ...
随机推荐
- javaweb中的标签的核心标签库的常用标签
//标签的使用使得页面的代码更加简洁,jsp脚本的尽可能少的使用,所以熟练掌握标签对于开发是很有必要的 <%--set设置数据,默认在page域 --%> <c:set var=&q ...
- 重装系统win10教程(激活系统、office下载、分区)
看见有很多小白不知道怎么重装系统,故而在此特别做一个详细教程,大家按照教程做就可以了,也不用去电脑店浪费钱重装系统,在此安装的win10系统,现在win10系统已经是最好的Windows系统了,如果没 ...
- 02-spring框架—— IoC 控制反转
控制反转(IoC,Inversion of Control),是一个概念,是一种思想.指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理. 控制反转就是对对象控制权的转移 ...
- Mongodb操作-更新操作符
1.$inc 用法:{$inc:{field:value}} 作用:对一个数字字段的某个field增加value 示例:将name为chenzhou的学生的age增加5 > db.student ...
- JS---client系列
offset系列:获取元素的宽,高,left,top, offsetParent offsetWidth:元素的宽,有边框 offsetHeight:元素的高,有边框 offsetLeft:元素距 ...
- Linux系统层级结构标准
Linux Foundation有一套标准规范: FHS: Filesystem Hierarchy[‘haɪərɑːkɪ] Standard(文件系统层级标准)目前最新的标准是2.3版本:http: ...
- C++之++操作符重载
++ 运算符,还可分为前缀 ++ 和后缀 ++ 运算符. 重载前缀++运算符 C++ 允许重载前缀运算符,以使表达式 ++b 能递增 b 的长度值,并返回结果对象.该运算符可以作为成员函数来重载,这使 ...
- python 安装第三方包
python环境是Anaconda3安装的,由于项目需要用到git的第三方包,但是在conda自带的环境中没有. 例如使用jieba分词库. 安装的三种方式: (1)全自动安装:`easy_insta ...
- 在mac中,npm安装或者卸载失败,提示没有权限
在终端输入 sudo chown -R $USER /usr/local 输入开机密码
- 实现一个成熟的底层毛玻璃效果(纯CSS)
写在前面 毛玻璃背景是一个很常见的网页样式,想要实现,其实并不难,但经过我在网上的搜索发现,大量实现方法都较为不规范,且把问题复杂化了(例如各种z-index属性和position的定位)现提供一个代 ...