简介

在之前已经笔者已经写过利用.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前缀导出)的更多相关文章

  1. C++调用DLL有两种方法——静态调用和动态调用

    C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报  分类: cpp(30)  [ ...

  2. DLL动态链接库导出函数方法 -- 动态导出(.def文件导出)

    简介 动态链接库最大的优势在于可以提供给其他应用程序共享的资源,最小化应用程序代码的复杂度,其中一个十分重要的功能就是dll可以导出封装函数的功能.导出函数有两种主要方式,分别是静态导入和动态导入,本 ...

  3. DLL导出函数和类 之 __declspec(dllexport)

    可利用__declspec(dllexport)导出函数或类. 若要指定C类型约定导出,则需在前面加extern “C”. 若要导出函数,__declspec(dllexport) 关键字必须出现在调 ...

  4. VS2013 c++ 生成和调用DLL动态链接库(.def 方法已验证OK)

    转载:https://blog.csdn.net/zhunianguo/article/details/52294339 .def 方法 创建动态库方法: 创建动态库是生成 .dll .lib 两个个 ...

  5. DLL模块例2:使用__declspec(dllexport)导出函数,extern "C"规范修饰名称,隐式连接调用dll中函数

    以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html ...

  6. MFC DLL 导出函数的定义方式

    一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解.要学习,这篇文章先总结DL ...

  7. DLL模块例1:使用.def模块导出函数,规范修饰名称,显示连接调用dll中函数

    以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html ...

  8. vs 连接过程报错 dll 分析 ------- DLL动态链接库

    1:编译成功,说明代码没有问题了2:连接报错,说明 exe 在查找dll 的入口地址过程,找不到合适的信息,这些信息保存在 dll 对应的 *.lib 文件里面  说明:exe如果生成成功了lib 这 ...

  9. VC DLL方法的__declspec导入导出

    https://msdn.microsoft.com/zh-cn/library/a90k134d.aspx https://msdn.microsoft.com/zh-cn/library/ms23 ...

随机推荐

  1. 第六章 对象作用域与servlet事件监听器

          作用域对象 Servlet上下文监听器 Servlet会话监听器 Servlet请求监听器     一:对象作用域 作用域对象 属性操作方法 作用域范围说明 ServletContext( ...

  2. linq中last或者lastordefault不存在的问题

    在使用linq访问数据库的时候发现first以及firstordefault都存在,但是last以及lastordefault不存在.上网找寻一番发现是last只在linq to object中实现了 ...

  3. NYOJ 1013 除法表达式(欧几里德算法+唯一分解定理)

    题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=1013 描述 给出一个这样的除法表达式:X1/X2/X3/···/Xk,其中Xi是 ...

  4. IIS 是如何处理 ASP.NET 请求的

    #main{ width:1250px; } #mainContent{ width:915px } img#imgTop{ max-width:850px; } Web 服务器 VS Web 应用程 ...

  5. JS DOM操作(三) Window.docunment对象——操作属性

    属性:是对象的性质与对象之间关系的统称.HTML中标签可以拥有属性,属性为 HTML 元素提供附加信. 属性总是以名称/值对的形式出现,比如:name="value". 属性值始终 ...

  6. JavaScript 日期多加一天 方法

    今天查看项目发现有出bug,由于未了符合sql语句的要求,前台网页显示的时候传到后台的时候要+1天, 网上查看了别人写的,发现多多少少有点漏洞,经过我自己总结,写出了达到了我要求的 var str = ...

  7. 【10-2】复杂业务状态的处理(从状态者模式到FSM)

    一.概述 我们平常在开发业务模块时,经常会遇到比较复杂的状态转换.比如说用户可能有新注册.实名认证中.已实名认证.禁用等状态,支付可能有等待支付.支付中.已支付等状态.OA系统里的状态处理就更多了. ...

  8. Python traceback 异常处理

    刚接触Python的时候,简单的异常处理已经可以帮助我们解决大多数问题,但是随着逐渐地深入,我们会发现有很多情况下简单的异常处理已经无法解决问题了,如下代码,单纯的打印异常所能提供的信息会非常有限. ...

  9. sublime3 常用快捷键

    轻量级编辑器,一直用的sublime text3 , 可以根据自己喜好安装喜欢的风格插件,根据工作需求安装代码处理插件. 下一章将推荐我常用的一些风格与代码插件 这里记录一些sublime 常用的快捷 ...

  10. 【代码笔记】iOS-将地址解析成经纬度

    一,工程图. 二,代码. ViewController.h #import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h& ...