文档章节

Code - Windows 动态库创建与使用

NDSM
 NDSM
发布于 2014/03/29 12:42
字数 714
阅读 198
收藏 3

创建部分:
1.使用导出函数关键字_declspec(dllexport)创建:

//DllTest.h
extern "C" _declspec(dllexport) int Max(int a, int b); //导出声明
extern "C" _declspec(dllexport) int Min(int a, int b); 

//DllTest.cpp
#include "DllTest.h"

int Max(int a, int b) 
{
    return (a>=b)?a:b;
}

int Min(int a, int b) 
{
    return (a<=b)?a:b;
}

2.使用模块文件(;后的一行代表注释)  VS2012 没有实验成功

;DllTest.def
LIBRARY DllTest

EXPORTS
Max@1
Min@2

.def 文件的规则为:
(1)LIBRARY 语句说明.def 文件相应的 DLL;
(2)EXPORTS 语句后列出要导出函数的名称。可以在.def 文件中的导出函数名后加@n,表示要导出函数的序号为 n(在进行函数调用时,这个序号将发挥其作用);
(3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。

 

 

使用部分:

采用隐式链接方式建立一个DLL文件,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。

//UseDll.h 声明
#pragma comment(lib,"DllTest.lib") 
extern "C"_declspec(dllimport) int Max(int a,int b); //导入声明
extern "C"_declspec(dllimport) int Min(int a,int b); 

//UseDll.cpp
#include"Dlltest.h" 
void main() 
{ 
    printf("MinValue:%d\n",min(8,10) ); 
}

显式链接,程序员就不必再使用导入文件,而是直接调用Win32的LoadLibary函数,并指定DLL的路径作为参数。LoadLibary返回HINSTANCE参数,应用程序在调用GetProcAddress函数时使用这一参数。GetProcAddress函数将符号名或标识号转换为DLL内部的地址。

#include "stdafx.h"
#include <Windows.h>
typedef int(*pMax)(int a,int b);//定义与动态库中的函数类型相同的指针类型

int _tmain(int argc, _TCHAR* argv[])
{
    pMax MaxFunc;
    HINSTANCE   hDLL; //DLL 句柄
    hDLL=LoadLibrary("TestDemo_CreateDll.Dll");//加载动态链接库文件
    MaxFunc=(pMax)GetProcAddress(hDLL,"Max"); 
    int MaxValue=MaxFunc(5,8); 
    printf("两数最大值:%d\n",MaxValue); 
    FreeLibrary(hDLL);//卸载Dll文件
    return 0;
}

© 著作权归作者所有

NDSM
粉丝 14
博文 47
码字总数 24990
作品 0
程序员
私信 提问
(转) Linux下生成动态链接库是否必须使用 -fPIC 的问题

在 Linux 下制作动态链接库,“标准” 的做法是编译成位置无关代码(Position Independent Code,PIC),然后链接成一个动态链接库。经常遇到的一个问题是 -fPIC 是不是必需,因为好像不加经...

一直不灵活
2012/09/30
90
0
Windows下通过Python 3.x的ctypes调用C接口

在Python中可以通过ctypes来调用动态库中的C接口,具体操作过程如下: 1. 使用vs2013创建一个加、减、乘、除的动态库,并对外提供C接口,code内容如下: math_operations.hpp: #ifndef TESTD...

fengbingchun
2018/04/19
0
0
15 款最好的 C/C++ 编译器和集成开发环境

我们有很多编程语言来进行 web 开发,比如 Java,.Net,PHP,Ruby,Perl,Python 等等。今天我们主要讨论的是两大古老而又流行的语言: C 和 C++ ,它们有着许多卓越的特性,更高效的功能和支...

oschina
2014/03/03
354.9K
84
C++加载动态链接库(cmake生成,隐式链接,显示链接)

版权声明:原创文章如需转载,请在左侧博主描述栏目扫码联系我并取得授权,谢谢 https://blog.csdn.net/u012234115/article/details/87875639 C++程序在运行时有两种方式加载动态连接库:隐式...

踏莎行hyx
02/22
0
0
Ubuntu使用VS Code开发C++程序

安装VS Code 下载地址https://code.visualstudio.com/download 2. 安装C++扩展程序 详情请看https://code.visualstudio.com/docs/languages/cpp https://blogs.msdn.microsoft.com/vcblog/20......

山里来的鱼
2016/08/02
71
0

没有更多内容

加载失败,请刷新页面

加载更多

Giraph源码分析(八)—— 统计每个SuperStep中参与计算的顶点数目

作者|白松 目的:科研中,需要分析在每次迭代过程中参与计算的顶点数目,来进一步优化系统。比如,在SSSP的compute()方法最后一行,都会把当前顶点voteToHalt,即变为InActive状态。所以每次...

数澜科技
今天
4
0
Xss过滤器(Java)

问题 最近旧的系统,遇到Xss安全问题。这个系统采用用的是spring mvc的maven工程。 解决 maven依赖配置 <properties><easapi.version>2.2.0.0</easapi.version></properties><dependenci......

亚林瓜子
今天
10
0
Navicat 快捷键

操作 结果 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的sql语句 F6 打开一个mysql命令行窗口 ctrl+l 删除一行 ...

低至一折起
今天
10
0
Set 和 Map

Set 1:基本概念 类数组对象, 内部元素唯一 let set = new Set([1, 2, 3, 2, 1]); console.log(set); // Set(3){ 1, 2, 3 } [...set]; // [1, 2, 3] 接收数组或迭代器对象 ...

凌兮洛
今天
4
0
PyTorch入门笔记一

张量 引入pytorch,生成一个随机的5x3张量 >>> from __future__ import print_function>>> import torch>>> x = torch.rand(5, 3)>>> print(x)tensor([[0.5555, 0.7301, 0.5655],......

仪山湖
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部