用VC++5.0制作DLL经验一二
--------------------------------------------------------------------------------
发布者:soarlove 类别:dll编程 日期:2002.08.21 14:22:01 今日/总浏览: 2/366
简要说明:
本文'一'、'二'两部分适用于对DLL的基本制作方法已经了解,或手头有关于DLL制作方法的书籍的读者.对于初次接触DLL制作的读者,建议您先按'三'中的步骤建立一个自己的DLL并在另一个应用程序中成功的调用它之后再阅读'一'、'二'.
---- DLL可以分为两个不同的类别:用C/C++(不用对象)编写的基于API的传统DLL和基于MFC对象的DLL.
一.两种类型的比较:
---- 1. 基于MFC的DLL限制在使用MFC的编译器中.
---- 基于API的DLL可以从一种编译器移植到另一种编译器.
---- 2. 基于MFC的DLL可以由制作向导构建框架,制作简单
---- 基于API的DLL的制作向导只为你制作了一个空的DLL工程,工程的维护和代码的编写全部需要手工完成(这一点在VC 6.0中有了改进)
---- 3. 基于MFC的DLL不适用与制作读取二进制文件的DLL
---- (无法正确读取与DOS应用程序共享的二进制文件)
---- 基于API的DLL可以正确读取在DOS环境中创建的二进制文件.
---- 造成该结果的原因其实很简单:
---- 在读取二进制文件的过程中通常会使用"结构(体)",基于MFC的DLL要加载MFC,它要求"结构成员位对齐"的比特位是8位,而且你无法方便的通过选中"Project- >Setting- >C/C++"选项卡中的"Code Generation"再修改"Struct member alignment"来使其变为1位(在VC5.0中即使改变了,在编译时该改变也会被忽略.不过这一不足在VC6.0中已经得到了改进,读者有兴趣的话可参见笔者《在VC6.0中读取二进制文件的惊喜》一文).
---- 而基于API的DLL则可以通过以上的方法方便的实现.
二.在实际制作与使用中的一点经验:
---- 1.制作DLL的目的之一是共享资源/代码.所谓"共享"当然不应该仅仅是几个VC++制作的应用程序可以使用,但是在与其他编程语言协作时,有些问题是需要注意的.
---- 在制作DLL时,VC++对函数的省缺声明是"__cedcl",也就是说,如果你在声明你的函数时不作特殊声明的话,你制作的DLL将只能被C/C++调用,如果你想用其他开发语言(比如VB5.0)调用它就会报错,即使调用方法完全正确.
---- 那么该怎么办呢,你一定已经猜到了---不要用省缺的声明方式---一个很好的选择是使用"WINAPI"来声明你的函数.它可以把你的DLL中的函数声明成WINDOWS API供其他程序调用(当然也包括C/C++制作的程序).
---- 2.建议你在制作DLL的同时制作包括导出函数原型声明的.H文件虽然这不是必须的但是若你的DLL是被C/C++调用,.H文件和.LIB文件可以为使用你的DLL的开发人员省去不少精力,当你需要修改/升级你的DLL时更是如此.DLL的C/C++使用者只要在工程中引入.H和.LIB文件可以象使用自己编写的函数一样方便的使用DLL中的函数,不必再使用存储DLL句柄、声明函数型指针、LoadLibrary、GetProcAddress那样繁复的调用方式.
---- 3.虽然你不必编写.DEF文件就能制作出基于API的.DLL文件.但是制作.DEF文件并不难,至少你有捷径可以走.有一个很简单的方法你不妨一试:
---- 例如,你用基于API的方法制作了一个DLL工程文件并为其编写了.CPP和.H文件,你可以保存并关闭该工程,然后在另一个目录中创建一个与其同名的基于MFC的DLL工程.好了,现在你已经知道怎么做了---将该目录中的.DEF文件移动过去就可以了.省下的工作就是再次打开基于API的DLL工程,并将.DEF文件加入工程,将你的导出函数的函数名加到EXPORTS之后,再重新编译工程就OK了.
---- 4.DLL文件的省缺名称是与工程名一致的(也是在.DEF文件中LIBRARY 之后的名字),不要试图在制作完毕之后通过简单的修改.DLL文件的文件名来改变它,这会导致使用该DLL的应用程序错误.
三.一个例子:
---- DLL中定义有两种函数:
---- 导出函数(exportfunction): 可以被其他模块调用
---- 内部函数(internalfunction): 只能在DLL内部使用
---- 创建一个基于API的DLL.本例只定义了导出函数.
---- 1.在FILE- >NEW- >PROJECTS中选择"WIN32 Dynamic-Link Library"在Project Name中输入 "a"按OK
---- 2.在FILE- >NEW- >FILES中选择C++ SOURCE FILE,在FILE中输入a.cpp,按OK
---- 在FILE- >NEW- >FILES中选择TEXT文件,在FILE中输入a.h,按OK
---- 在FILE- >NEW- >FILES中选择TEXT文件,在FILE中输入a.def,按OK
---- 3.源文件:
//---------------------------
//a.cpp
#include < windows >
WINAPI int add(int a,int b)
{ return (a+b);
}
//---------------------------
//a.h
WINAPI int add(int a,int b);
//---------------------------
//a.def
LIBRARY "aaa" ;指出DLL的名字
DESCRIPTION 'aaa Windows Dynamic Link Library'
;描述DLL的用途(此句可选)
EXPORTS add ;导出函数的名字
四.调用DLL的方法:
---- 1.通常我们在调用DLL时所需的DLL文件必须位于以下三个目录之一:
---- (1)Windows的系统目录:/windows/system;
---- (2)DOS中path所指出的任何目录;
---- (3)程序所在的目录;
---- 同时应注意管理好你的.lib文件和.h和文件
---- 2.建立一个工程,简单起见可建立一个控制台应用程序.
---- 3.在工程中引入a.lib:
---- (1)如果你的a.lib放在VC标准的LIB文件夹中.
单击Project- >Project Settings...
在link选卡的object/library modules中加上a.lib即可
---- (2)如果你的a.lib不是放在VC标准的LIB文件夹中
单击Project- >Add to Project- >files...
找到a.lib文件,按OK
< pre >
4.//------------------------
//call_a.cpp
#include< stdio.h >
#include "c:/a/a.h"
void main(void)
{ int c=0;
c=add(1,2);
printf("1+2=%d",c);
}
//本程序在VC5.0下调试通过发布者: soarlove
相关推荐
VB调用c++写的Dll的一点总结
最近,写了一个VB应用程序,这个APP主要是用来演示三个C++写的视频处理动态链接库的使用方式。第一次写VB的代码,确实遇到了很多问题,现在回想一下,真的是很多东西走了或多或少的弯路,现在把这些东西总结并记录下来,期望以后写兼容VB的动态库,可以注意接口的定义,并不是所有的接口定义方式,都方便VB使用,再者,就是在VB中使用的一些知识积累。C++写的DLL接口定义需注意的事项1.
【C++】DLL文件的编写与实现——三步走
一、DLL是什么? 动态链接库(Dynamic Link Library)DLL文件与EXE文件一样也是可执行文件,但是DLL也被称之为库,因为里面封装了各种类啊,函数啊之类的东西,就像是一个库一样,存储着很多东西,主要是用来调用的。调用方式主要分为两种:隐式(通过lib文件与头文件) 与 显式(只通过DLL文件)。 (这是一条弹幕:2019.5.10 很多人私信我 我肥来说下 ,调用方是需要使用三件套的就是.h\.lib\.dll。只使用dll和lib调用的话,我再写一篇好了 地址在这边(点我点我).
C/C++写dll文件
DLL即Dynamic Link Library(动态链接库)的缩写。什么是动态链接库。我用的codeblocks开发环境。第一步创建一个动态链接库工程FIle > New > Project > Dynamic Link Library 创建完成后打开main.cpp编辑器会自动生成一段代码#include "main.h" // a sample exported function void
C++编写DLL的方法
在写C++程序时,时常需要将一个class写成DLL,供客户端程序调用。这样的DLL可以导出整个class,也可以导出这个class的某个方法。 一、导出整个class 方法很简单,只需要在类的头文件中class和类名之间加上_declspec(dllexport),同时在另外一份提供给客户端调用程序使用的类的头文件中class和类名之间加上_declspec(dllimport)...
python编译成dll_如何用 C++ 为 Python 写 dll
1. 先新建一个名为 hello.cpp 的 C++ 源文件:#include #define DLLEXPORT extern "C" __declspec(dllexport)DLLEXPORT int __stdcall hello(){printf("Hello world!\n");return 0;}2. 编译成 dll 文件:cl /LD hello.cpp注意, 这里的参数是 /L...
双RTX 3090实战:如何用vLLM低成本部署Qwen2.5-14B大模型(附避坑清单)
本文详细介绍了如何利用双RTX 3090显卡低成本部署Qwen2.5-14B大模型的完整指南,包括硬件选型、环境配置、vLLM优化及生产环境调优。重点解析了BF16混合精度在显存占用与推理质量上的平衡策略,并提供了实用的避坑清单和性能调优技巧,帮助开发者高效实现大模型部署。
学懂C++(五十七): C++ 动态链接库(DLL)开发详解
学懂C++: C++ 动态链接库(DLL)开发详解
保姆级教程:在K230开发板上为张大头步进电机实现位置、速度、回零全功能控制
本文提供了一份详细的K230开发板与张大头步进电机的控制教程,涵盖硬件连接、协议解析、模块化代码实现及实战案例。通过位置、速度和回零功能的全面讲解,帮助开发者快速掌握步进电机的高级控制技术,适用于自动化、机器人等应用场景。
C++编写一个简单的DLL
什么是DLL: 自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上 Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着,例如显示的字体和图标存储在GDI DLL中、显示Windows桌面和处理用户的输入所需要的代码被存储在一个User DLL中、Windows编程所需要的大量的API函数也被包含在Kernel DLL中。 DLL是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数和
深度学习(Deep Learning, DL)简介
深度学习(Deep Learning, DL)是机器学习的一个子领域,主要使用多层神经网络来处理复杂的数据和任务。深度学习通过模拟人脑的神经网络结构,能够自动提取特征并进行高效的模式识别和预测。
阿里数据集(cluster-trace-v2018)提取
阿里数据集提取 本数据集采用的是阿里集群数据集-2018 详情可参考该文献:https://blog.csdn.net/weixin_41988248/article/details/92431588 CSV数据集提取操作见:https://blog.csdn.net/lucky_shi/article/details/105321149 关于read_csv包的用法见:https://blog.csdn.net/dc19971118/article/details/107721340 从阿里数据集来看,我
QT调用C++写的Dll
C#写的dll是没有dllMain入口函数的,是一种中间语言,需要.Net运行时进行做本地化工作,因此如果要调用C#写的dll,需要依赖.Net运行时,然而Qt中还无法直接调用.Net运行时,最好的方式是能够在Qt中直接调用C#dll的函数,但是Qt明显只能调用C++写的dll,所以就只能通过编写一个C++的dll导出接口供Qt调用,这个C++编写的dll对C#写的dll进行封装,这个C++的dll可以采用/CLR方式对C#编写的dll进行引用的,即将C++编写的dll中生成的.lib文件供Qt进行链接,由
STM32与AD7606的SPI通信优化:提升高精度数据采集效率
本文深入探讨了STM32与AD7606的SPI通信优化策略,旨在提升高精度数据采集系统的效率与稳定性。文章从硬件连接、电源去耦、PCB布局等基础环节入手,详细解析了软件驱动中SPI模式配置、DMA应用及精准时序控制等关键优化技术,并提出了系统级的性能提升方案,帮助开发者解决高速采样下的数据跳动、效率瓶颈等实际问题。
C++调用C++写的DLL
C++调用C++写的DLL dll简介:在实际编程中,我们可以把完成某项功能的函数放在一个动态链接库里,然后提供给其他程序调用。像Windows API中所有的函数都包含在dll中,如Kernel32.dll, User32.dll, GDI32.dll等。 dll文件可以简单地理解成程序的一个“模块”,在需要时才调入内存,用完后还可以卸载,有利于提高性能。 简单扫盲: ...
开篇词:学习系统分析师的好处?核心考点有哪些?
系统分析师备考指南 系统分析师是IT行业的高级专业人才,具备系统分析与设计能力,能指导开发团队工作。学习系统分析师不仅能获得职业晋升的"黄金跳板",还能全面提升技术架构思维和业务理解能力。 核心价值: 职业发展:晋升管理岗位的硬性要求,突破职业天花板 能力提升:构建T型知识结构,培养架构思维和软技能 市场竞争力:成为"业务+技术"桥梁,获得国家级专业认证 考试内容: 计算机基础知识(硬件、操作系统、网络等) 系统分析专业知识(软件工程、架构设计等) 进阶知识(企业信息
从0到1用OpenClaw打造酒店收益管理系统:数据整合→AI策略迭代全链路落地实战
本文基于三亚某连锁海景酒店真实项目落地经验编写,系统上线3个月,酒店平均入住率从62%提升至80%,RevPAR(平均可售房收入)提升26%,淡季空置率降低46%,完全覆盖中小酒店全场景收益管理需求。本文配套OpenClaw全量Skill代码、工作流配置文件,可直接复用落地。
c++调用自己写的dll
在 Visual Studio 2022 中创建一个 C++ 动态链接库 (DLL) 项目时,通常会看到如图所示的初始文件夹和文件结构。通过理解这些文件夹和文件的作用,你可以更好地组织和管理你的 DLL 项目,确保编译和链接过程顺利进行。
45、使用 sqlread 函数将数据从数据库表导入 MATLAB
本文详细介绍了如何使用 MATLAB 中的 `sqlread` 函数从不同类型的数据库(如 Microsoft SQL Server 和 SQLite)中导入数据。文章涵盖了 `sqlread` 的基本语法、输入输出参数、使用示例以及注意事项,并通过多个实例演示了自定义导入选项、元信息检索和数据类型转换等内容。此外,还总结了导入数据库数据的通用流程及最佳实践建议,帮助用户更高效地进行数据分析和处理工作。
ROS机械臂正向运动学实战:Python调用MoveIt与PyKDL详解
正向运动学是机械臂控制的基础,通过已知关节角度计算末端执行器的位姿。在ROS生态中,MoveIt作为核心运动规划框架,集成了KDL等求解器,为正向运动学提供了高效接口。Python开发者可通过moveit_commander或GetPositionFK服务调用MoveIt,也可使用PyKDL直接计算,后者在批量处理时性能更优。该技术广泛应用于机械臂验证、标定、视觉伺服及碰撞预检测等场景。本文聚焦ROS环境下Python控制MoveIt实现正向运动学的完整流程,涵盖环境配置、接口选择、参数计算与常见问题排查,
文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况
主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。
假人有限元模型
假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用
python写dll接口_如何用 C++ 为 Python 写 dll
1. 先新建一个名为 hello.cpp 的 C++ 源文件:Cpp代码 #include#defineDLLEXPORTextern"C"__declspec(dllexport)DLLEXPORTint__stdcallhello(){printf("Helloworld!\n");return0;}#include #define DLLEXPORT ext...
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
在C#中调用C++写的DLL
这里两个问题,一是如何将C++编译成dll,二是在C++和C#中调用这个dll1,写C++的dll,参照以下link,它说的是C++中的dll调用,所以肯定成功http://msdn2.microsoft.com/en-us/library/ms235636(VS.80).aspx 2,写一个C#,调用上面写的dll2.1将以上的dll拷贝到debug/release目录,然后写C
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
c++调用c#写的DLL
c++调用c#写的DLL; 此文章演示了建立c#的dll; c++建立工程,引入dll; 不能解决的问题: 指定dll的路径,在代码里面直接写 #using "xxx.dll" 必须要在使用路径 #using "../bin/debug/xxx.dll" 1-建立c#的dll,过程略; 2.修改输出路径输出为 ../bin/debug; ../bin/release 方便c++可以定位找到 3.在解决方案添加C++工程,过程略 4.新添加的C++工程,引用DL...
C#调用C++写的dll,C++调用C++的dll
C#语言使用方便,入门门槛较代,上手容易,并且语法与C,java有很类似的地方,IDE做的也好,通用性好,是MS下一代开发的主要力量.但是其开源代码较少,类库不是十分完美,在架构方面还有一些需要做的工作.C++写的程序占用内存较小,直接对内存或者文件操作,因此一些关键的步骤或者一些最内层的循环在一定程序上还需要依赖C++.下面我做一些简单的例子第一步,用C++做一个可以导出函数的dll
java调用C/C++写的dll
Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性。Java调用C/C++写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异,所以在参数传递过程中容易出现问题,DLL中可能需要做相应的转换。使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob. 其JNI(Java Nati
C++写DLL,PB调用
c++ 写的dll,供PB调用
1万+



被折叠的 条评论
为什么被折叠?



