建立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 ...
随机推荐
- ubuntu终端安装ss
大概就是这样
- DiffUtil和LiveData使用时遇到的问题
android在28之后换成了androidx,在此之前也可以用到这些功能,不过是引入的包不同,写法也有一些小的差别.我们之前的代码使用的是BaseQuickAdapter,所以不可以直接使用JetP ...
- namenode datanode理解
HDFS是以NameNode和DataNode管理者和工作者模式运行的. NameNode管理着整个HDFS文件系统的元数据.从架构设计上看,元数据大致分成两个层次:Name ...
- Darknet版YOLO安装与配置
Darknet配置和安装 1. 安装显卡驱动 首先查看一下自己的电脑需要怎样的驱动,我们可以先到 http://www.nvidia.com/Download/index.aspx 查询下我们需要的是 ...
- IIS 程序池优化配置方案
内容目录 IIS 程序池优化配置方案IIS高并发配置一.IIS站点绑定程序池设置二.支持万级并发请求 IIS 程序池优化配置方案 最近由于系统的客户越来越多,有客户反映访问速度变慢,尤其是api的请求 ...
- xhost + command not found
如下是一个示例: 原本我以为在没有联网的情况下.不能使用yum 的.可能是本地配置了yum 了吧也可以使用 1. [oracle@11GR2-test ~]$ export DISPLAY=192.1 ...
- require是什么?能做什么
本来是做后端的,拿到一个偏前端的项目,js文件里好多define和require,看的有点蒙,只能自己动手查找资源了,了解这到底是个什么,它能做什么? 1.什么是require.js? 1):requ ...
- Java Arrays.asList注意事项
https://blog.csdn.net/kusedexingfu/article/details/77824189
- TCP/IP网络编程系列之一(初级)
概述 网络编程实际上就是编写程序使两台联网的计算机相互的交换数据.操作系统会提供名为“ 套接字 ”的部件.套接字是网络数据传输的软件设备,即使对网络数据传输原理不太熟悉也无关紧要.我们也能通过套接字完 ...
- 项目的Servlet类找不到
先右击项目,