dll文件

解析重定位表

孤者浪人 提交于 2019-12-04 00:27:56
1.创建一个用来试验的目标dll 头文件: #if !defined(AFX_HELLO_H__87AA4900_2935_4604_AFB2_7CD004B103D8__INCLUDED_) #define AFX_HELLO_H__87AA4900_2935_4604_AFB2_7CD004B103D8__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif #include "stdio.h" #define ONE "hello" #define TWO "Jim" extern "C" _declspec(dllexport) void __stdcall hello(); //导出函数 #endif 实现: #include "Hello.h" #define THREE "nice to meet you" void __stdcall hello(){ printf("%s %s %s",ONE,TWO,THREE); } 该dll提供一个函数hello();作用是输出“hello jim nice to meet you”; 在main中测试dll: 复制编译后生成的.lib和.dll文件到测试工程目录下; 导入dll,这里使用静态导入; 使用dll中的函数; 代码: #include <stdio.h>

动态库调用(C++)问题

吃可爱长大的小学妹 提交于 2019-12-03 22:24:27
.dll 该文件不用多说 .lib C++静态编译时需要 否则会编译出错 除非是测试客户端:建立了依赖关系 编译时会自己生成 #pragma comment(lib,"..\\Release\\DllKmeans.lib") .h 如果没有该文件 需要自己导入函数 否则找不到函数声明 #define DllImport extern "C" _declspec(dllimport) DllImport bool InitializeMlDll(); 与之对应的生成方式(被调用端) 如果说是没法使用.h的平台 比如C# #define DllExport extern "C" __declspec(dllexport) DllExport bool InitializeMlDll() { } 使用MFC编写的DLL,可以分成两大类: 规则DLL——规则(regular)DLL中所包含的函数,可以被所有Windows应用程序使用; 共享MFC——DLL中不包含MFC库函数,需要另外安装MFC动态链接库后才能使用; 静态MFC——DLL中包含MFC库函数,可以脱离MFC动态链接库独立使用。 扩展 DLL ——扩展( extension ) DLL 中所定义的类和函数, 只能被所 MFC 应用程序使用 。 而且扩展 DLL 中不能包含 MFC 库函数,也需要另外安装 MFC

VS2008 创建DLL和调用DLL

扶醉桌前 提交于 2019-12-03 19:06:50
隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。隐式链接必须的文件:lib . 显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。 使用显式链接应用程序编译时不需要使用相应的Lib文件。另外,使用GetProcAddress()函数时,可以利用MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,"Min")改为GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函数Min()在DLL中的顺序号是2),这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。 显式链接必须的文件:dll . 一、DLL的创建 (用.def文件创建动态连接库)

C++ dll的创建和使用

谁说胖子不能爱 提交于 2019-12-03 12:14:28
在介绍Dll之前先了解下常见三种函数调用约定。 参考: https://www.cnblogs.com/yejianyong/p/7506465.html 我们使用的VS默认使用的函数调用约定是__cdel,而Windows API默认的调用约定是__stdcall。我们在使用一个dll的接口时,一定要确保你使用接口时的调用约定和接口定义时的调用约定一致。因为不同的调用约定,函数的栈内存释放的方式不同。 然后我们再了解下extern C的作用,参考 https://www.cnblogs.com/carsonzhu/p/5272271.html 。 如果我们使用C++进行程序开发,开发过程中使用到了C语言写的库函数,则我们就需要使用extern C 来修饰,来告诉编译器,这部分代码使用C语言语法进行编译链接。 例如: #ifdef __cplusplus extern "C" { #endif #include "legacy_C_header.h" #ifdef __cplusplus } #endif 这个就是它允许你在你的C ++代码中使用这个C头文件,因为宏“__cplusplus”将被定义。 下面我们开始学习C++Dll的创建和使用 C++创建的dll既可以给C++工程使用也可以给C#工程使用。 C++导出函数,在DLL中有一张导出表,记录着需要导出的函数

运行MFC程序提示没有找到MFC42D.DLL文件的解决方法

谁都会走 提交于 2019-12-03 10:20:59
运行MFC AppWizard(exe)程序,汇编成功,可是运行时,出现错误:“没有找到MFC42D.DLL,因此这个应用程序未能启动.重新安装应用程序可能会修复此问题. ” 解决方案为:出现上述提示的原因是默认情况下MFC程序是使用的动态联编方式,这种情况下在对方机器中没有安装VC++程序的情况下就会出现这个错误提示。解决的方法很简单,就是编译的时候采用静态联编的方式,也就是说将用到的dll文件编译到程序中。 具体操作方法:Project -> Settings… 在General标签下面的Microsoft Foundation Class下面选择Use MFC in a Static Library即可。 疑问: 1:Use MFC in a Static Library和Use MFC in a Shared DLL这两个选项有什么区别.? 2:MFC42D.DLL这个文件是干什么用的? 1.Use MFC in a Static Library,在静态库中使用MFC,这样发行时就不需要MFC的DLL,否则,发行时需要一并发生MFC的动态库。 2.MFC42D.DLL是4.2版的MFC的DLL。 当运行程序或者游戏时,系统弹出错误提示“ 找不到 mfc42d.dll”,或者“ 没有找到 mfc42d.dll”时,说明您系统中缺失这个dll文件或者该dll文件没有被注册

程序员需要了解的硬核知识之磁盘

亡梦爱人 提交于 2019-12-03 10:05:26
程序员需要了解的硬核知识之磁盘 https://www.cnblogs.com/cxuanBlog/p/11776310.html 此篇文章是 《程序员需要了解的硬核知识》系列第四篇,历史文章请戳 程序员需要了解的硬核知识之内存 程序员需要了解的硬核知识之CPU 程序员需要了解的硬核知识之二进制 我们大家知道,计算机的五大基础部件是 存储器 、 控制器 、 运算器 、 输入和输出设备 ,其中从存储功能的角度来看,可以把存储器分为 内存 和 磁盘 ,内存我们上面的文章已经介绍过了,那么此篇文章我们来介绍一下磁盘以及内存和磁盘的关系。 认识磁盘 首先,磁盘和内存都具有存储功能,它们都是存储设备。区别在于,内存是通过 电流 来实现存储;磁盘则是通过 磁记录技术 来实现存储。内存是一种高速,造假昂贵的存储设备;而磁盘则是速度较慢、造假低廉的存储设备;电脑断电后,内存中的数据会丢失,而磁盘中的数据可以长久保留。内存是属于 内部存储设备 ,硬盘是属于 外部存储设备 。一般在我们的计算机中,磁盘和内存是相互配合共同作业的。 一般内存指的就是主存(负责存储CPU中运行的程序和数据);早起的磁盘指的是软磁盘(soft disk,简称软盘),就是下面这个 (2000年的时候我曾经我姑姑家最早的计算机中见到过这个,当时还不知道这是啥,现在知道了。) 如今常用的磁盘是硬磁盘(hard disk,简称硬盘)

关于windows dll的生成

丶灬走出姿态 提交于 2019-12-03 05:30:55
关于windows dll的生成 今天上午看到VC板上有人提到dll调用约定的问题,发现自己一直以来只是网上说的文章去做的,具体的实验还真的没有做过。中午闲来无聊,写了几个小例子,测试一下windows dll的生成规律。 windows下面的dll生成取决于以下几条因素 1. 根据DEF文件生成还是__declspec(dllexport)关键字指定 2. C编译还是C++编译 3. 调用约定是_ cdecl 还是_stdcall 测试环境 vc6.0绿色版 新建工程 testdll(win32 dynamic lib)用来生成dll 新建工程 testmydll(win32 console app),显示调用dll 生成dll文件testdll.cpp 测试dll文件testmydll.cpp 采用depends观察dll的输出函数名 1 使用_declspec(dllexport)关键字,C编译,_ cdecl 导出函数名 fnTestdll _ cdecl 调用 成功 , __stdcall调用 失败 2 使用_declspec(dllexport)关键字,C编译,_stdcall 导出函数名 _fnTestdll@4 _ cdecl 调用 失败 , __stdcall调用 失败 3 使用_declspec(dllexport)关键字,C++编译,_ cdecl 导出函数名

程序员需要了解的硬核知识之磁盘

狂风中的少年 提交于 2019-12-03 04:40:52
此篇文章是 《 程序员 需要了解的硬核知识》系列第四篇,历史文章请戳 程序员需要了解的硬核知识之内存 程序员需要了解的硬核知识之CPU 程序员需要了解的硬核知识之二进制 我们大家知道,计算机的五大基础部件是 存储器 、 控制器 、 运算器 、 输入和输出设备 ,其中从存储功能的角度来看,可以把存储器分为 内存 和 磁盘 ,内存我们上面的文章已经介绍过了,那么此篇文章我们来介绍一下磁盘以及内存和磁盘的关系。 认识磁盘 首先,磁盘和内存都具有存储功能,它们都是存储设备。区别在于,内存是通过 电流 来实现存储;磁盘则是通过 磁记录技术 来实现存储。内存是一种高速,造假昂贵的存储设备;而磁盘则是速度较慢、造假低廉的存储设备;电脑断电后,内存中的数据会丢失,而磁盘中的数据可以长久保留。内存是属于 内部存储设备 ,硬盘是属于 外部存储设备 。一般在我们的计算机中,磁盘和内存是相互配合共同作业的。 一般内存指的就是主存(负责存储CPU中运行的程序和数据);早起的磁盘指的是软磁盘(soft disk,简称软盘),就是下面这个 (2000年的时候我曾经我姑姑家最早的计算机中见到过这个,当时还不知道这是啥,现在知道了。) 如今常用的磁盘是硬磁盘(hard disk,简称硬盘),就是下面这个 程序不读入内存就无法运行 在了解磁盘前,还需要了解一下内存的运行机制是怎样的,我们的程序被保存在存储设备中

程序员需要了解的硬核知识之磁盘

 ̄綄美尐妖づ 提交于 2019-12-03 04:06:20
此篇文章是 《程序员需要了解的硬核知识》系列第四篇,历史文章请戳 程序员需要了解的硬核知识之内存 程序员需要了解的硬核知识之CPU 程序员需要了解的硬核知识之二进制 我们大家知道,计算机的五大基础部件是 存储器 、 控制器 、 运算器 、 输入和输出设备 ,其中从存储功能的角度来看,可以把存储器分为 内存 和 磁盘 ,内存我们上面的文章已经介绍过了,那么此篇文章我们来介绍一下磁盘以及内存和磁盘的关系。 认识磁盘 首先,磁盘和内存都具有存储功能,它们都是存储设备。区别在于,内存是通过 电流 来实现存储;磁盘则是通过 磁记录技术 来实现存储。内存是一种高速,造假昂贵的存储设备;而磁盘则是速度较慢、造假低廉的存储设备;电脑断电后,内存中的数据会丢失,而磁盘中的数据可以长久保留。内存是属于 内部存储设备 ,硬盘是属于 外部存储设备 。一般在我们的计算机中,磁盘和内存是相互配合共同作业的。 一般内存指的就是主存(负责存储CPU中运行的程序和数据);早起的磁盘指的是软磁盘(soft disk,简称软盘),就是下面这个 (2000年的时候我曾经我姑姑家最早的计算机中见到过这个,当时还不知道这是啥,现在知道了。) 如今常用的磁盘是硬磁盘(hard disk,简称硬盘),就是下面这个 程序不读入内存就无法运行 在了解磁盘前,还需要了解一下内存的运行机制是怎样的,我们的程序被保存在存储设备中,通过使用

C++工程调用C#的DLL文件

匿名 (未验证) 提交于 2019-12-03 00:43:02
1、声明动态库的具体位置: #using "F: \\LIN.DLLService.dll" 2、使用命名空间 using LIN::DLLService; 3、实例化对象: gcroot<MESHelper^> g_pMESHelper; g_pMESHelper = gcnew MESHelper; 4、调用具体函数: String ^ResCode = gcnew String( "LIN01" ); CString oErrMessage; String ^ErrMessage = gcnew String( "" ); bool b = g_pMESHelper->ATELogOut(ResCode,ErrMessage); char *buf = new char [BUFSIZE]; memset (buf, 0, BUFSIZE); if (!b) { for ( int i = 0; i < ErrMessage->Length; i++) } delete buf; 这里 有几点要记住 : 1.使用#using引用C# DLL,而不是#include; 2.别忘了using namespace LIN::DLLService; 3.使用C++/clr语法,采用正确的访问托管对象,即:使用'^',而不是星号'*'。 文章来源: C++工程调用C#的DLL文件