dll动态链接库导出函数方法 -- 静态导出(__declspec前缀导出)
简介
在之前已经笔者已经写过利用.def文件进行dll函数动态导出的文章,那么今天就给大家介绍一下,如何利用__declspec函数前缀进行简单的静态函数导出。
要点
大家阅读过动态导出的文章后,只需要将原文导出函数的前缀加上extern"C" __declspec(dllexport)前缀,然后删除原项目中的.def文件即可。
附上DLL源码与测试源码
- dll源码
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern"C" __declspec(dllexport) int ShowMessageBox(const WCHAR* lpText, const WCHAR* lpCaption)
{
MessageBox(NULL, lpText, lpCaption, 0);
return 0;
}
- 测试源码
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <Windows.h>
using namespace std;
typedef int(*ShowMessageBox)(const WCHAR* lpText, const WCHAR* lpCaption); //声明函数指针,告诉程序从动态链接库导入的地址是什么类型的函数
int main(void)
{
HMODULE hm = LoadLibrary("DemoDLL.dll"); //加载动态链接库
if (hm == NULL)
{
printf("Library Error !\n");
system("pause");
return 0;
}
ShowMessageBox SMessageBox = (ShowMessageBox)GetProcAddress(hm, "ShowMessageBox"); //查找函数地址
if (SMessageBox == NULL)
{
cout << GetLastError() << endl;
printf("GetProcAddress error \n");
system("pause");
return 0;
}
SMessageBox(L"HelloWorld", L"Tip"); //使用dll中导出的函数
FreeLibrary(hm);
return 0;
}
测试截图

dll动态链接库导出函数方法 -- 静态导出(__declspec前缀导出)的更多相关文章
- C++调用DLL有两种方法——静态调用和动态调用
C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报 分类: cpp(30) [ ...
- DLL动态链接库导出函数方法 -- 动态导出(.def文件导出)
简介 动态链接库最大的优势在于可以提供给其他应用程序共享的资源,最小化应用程序代码的复杂度,其中一个十分重要的功能就是dll可以导出封装函数的功能.导出函数有两种主要方式,分别是静态导入和动态导入,本 ...
- DLL导出函数和类 之 __declspec(dllexport)
可利用__declspec(dllexport)导出函数或类. 若要指定C类型约定导出,则需在前面加extern “C”. 若要导出函数,__declspec(dllexport) 关键字必须出现在调 ...
- VS2013 c++ 生成和调用DLL动态链接库(.def 方法已验证OK)
转载:https://blog.csdn.net/zhunianguo/article/details/52294339 .def 方法 创建动态库方法: 创建动态库是生成 .dll .lib 两个个 ...
- DLL模块例2:使用__declspec(dllexport)导出函数,extern "C"规范修饰名称,隐式连接调用dll中函数
以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html ...
- MFC DLL 导出函数的定义方式
一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解.要学习,这篇文章先总结DL ...
- DLL模块例1:使用.def模块导出函数,规范修饰名称,显示连接调用dll中函数
以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html ...
- vs 连接过程报错 dll 分析 ------- DLL动态链接库
1:编译成功,说明代码没有问题了2:连接报错,说明 exe 在查找dll 的入口地址过程,找不到合适的信息,这些信息保存在 dll 对应的 *.lib 文件里面 说明:exe如果生成成功了lib 这 ...
- VC DLL方法的__declspec导入导出
https://msdn.microsoft.com/zh-cn/library/a90k134d.aspx https://msdn.microsoft.com/zh-cn/library/ms23 ...
随机推荐
- google 被墙的解决办法
昨晚无意中发现的东西,分享给各位使用,google搜索技术方面的东西还是很准确的,可惜被墙了,但是上有政策下有对策…… 谷歌地址: http://74.125.224.18/ http://91.21 ...
- QT 手式编译步骤
1: qmake -project 2: qmake 3: make 4: ./执行
- Android性能测试--垃圾回收频次统计的作用
频繁的垃圾回收有可能暗示着内存泄露,在我手机统计数据,每次垃圾回收会占据100ms左右,这对内存和事件响应要求严格的程序(游戏等)来讲是可观的性能损耗.
- web api中访问数据库的内存释放问题
在使用web api开发微信后台的时候,本来想像MVC一样在controller中申明dbcontext全局变量,其它地方直接使用就可以了,结果调试过程中发现使用dbcontext访问数据库并获取qu ...
- java RMI原理详解
java本身提供了一种RPC框架——RMI(即Remote Method Invoke 远程方法调用),在编写一个接口需要作为远程调用时,都需要继承了Remote,Remote 接口用于标识其方法可以 ...
- python的Web框架,Django模板标签及模板的继承
模板标签 在传递数据的时候,会有大量的数据展示在浏览器上,而数据会是动态变化的,在html的编写中,数据也是需要动态的,而不能是写死的,如果动态展示呢. 给定的例子数据 views传递数据给html ...
- 网络之XML解析-GData
GDataXML是一套Google使用Objective-C开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询, GDataXML 是 iOS 下的一款轻量级 XML 解 ...
- [转]webpack4.0.1安装问题和webpack.config.js的配置变化
本文转自:https://blog.csdn.net/jiang7701037/article/details/79403637 The CLI moved into a separate packa ...
- C#基础知识回顾--串行化与反串行化
串行化是指存储和获取磁盘文件.内存或其他地方中的对象.在串行化时,所有的实例数据都保存到存储介质上, 在取消串行化时,对象会被还原,且不能与其原实例区别开来.只需给类添加Serializable属性, ...
- winform窗体 小程序【打开多个窗体、窗体之间传值、打开唯一窗体】
1.打开多个窗体 2.窗体之间的传值 3打开唯一窗体