dll文件编写
vb编写DLL学习

怎样用VB编写DLL文件???你先打开VB,然后先中“ActiveX Dll”工程,然后开始编辑。
编完后,保存一般是以“.cls”和“.vbw”保存。
这时你选择“文件”菜单,弹出下拉框,选中“生成.dll”选项,它就会在上面弹出一个进度条“正在生成.dll文件”。
生成以后是一个有好象齿轮状的图标。
如果你要引用,就开一个“标准EXE”工程,然后在“工程”选项中,单击“引用”,找到你刚才的“.dll”的文件名,在前面的复选框中打勾,就可以引用你刚才在那里面写的方法等。
在vb6里建新工程时选用建立dll 做好后用vb的引用就可以了VB中创建的DLL只是COM组件,无法作为输出函数的DLL,其实这只是个错误的说法。
其实MS 非常狡猾,如果你是个VB疯狂发烧友的话,应该早就狂试出这种可以创建输出函数的DLL的方法。
VB编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。
如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。
但是,在VB的工程选项中将这些屏蔽了。
而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过Link来创建我们需要的DLL了。
不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句:Sub MainIf MsgBox("哈哈", vbOKCancel) = vbOK ThenShell "link2.exe " & Command$End IfEnd Sub然后编译为LinkTemp.EXE,接下来将LINK.EXE改名为Link2.exe,将LinkTemp.EXE改名为Link.EXE。
这样在VB调用Link.EXE时会弹出对话框,处理就会中断。
这时就可以有机会将OBJ文件拷贝出来了。
然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd:Public Function mathadd(ByVal a As Long, ByVal b As Long) As Longmathadd = a + bEnd Function编译这个工程,在Link的时候就会中断。
MFC下DLL编程(图解)

MFC 下DLL 编程(图解)DLL (Dynamic Link Library ,动态链接库)是微软公司为Windows 和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库。
DLL 是应用程序的一种扩展,也是软件共享和重用的传统方法。
DLL 除了可同时被多个应用程序共享外,还可以在不改变调用接口(从而不需修改使用它的应用程序)的情况下,改进和升级里面的库函数。
而且DLL 与编写它的语言无关,例如,用VC 生成的规则DLL ,可以被VB 、Delphi 等生成的应用程序使用。
DLL 可以用多种语言和工具编写,我们这里只介绍如何使用MFC 来编写和使用DLL 。
相关说明文档位于MSDN 帮助的“目录\开发工具和语言\Visual Studio\Visual C++\常见编程方法\DLL\”中。
8.1 基础本节先讨论DLL 与静态库的区别,然后列出几种适合放置DLL 的目录,最后介绍MFC DLL 的三种类型。
8.1.1 DLL 与静态链接库静态链接库Lib (Static Link Library ),是在编译的链接阶段将库函数嵌入到应用程序的内部。
如果系统中运行的多个应用程序都包含所用到的公共库函数,则必然造成很大的浪费。
这样即增加了链接器的负担,也增大了可执行程序的大小,还加大了内存的消耗。
Lib 的好处是应用程序可以独立运行,而不需要在操作系统中另外安装对应的DLL 。
而DLL 采用动态链接,对公用的库函数,系统只有一个拷贝(一般是位于系统目录的*.DLL 文件),而且只有在应用程序真正调用时,才加载到内存。
在内存中的库函数,也只有一个拷贝,可供所有运行的程序调用。
当再也没有程序需要调用它时,系统会自动将其卸载,并释放其所占用的内存空间。
参见图8-1。
图8-1 静态库函数与动态链接库的区别DLL 的缺点是应用程序不能独立运行,需要在操作系统中另外安装对应的DLL 。
例如,如果你的MFC 项目被设置成“在共享DLL 中使用MFC ”的,则虽然生成的可执行程序很使用静态库函数使用动态链接库小,但是在其他没有安装Visual C++(运行环境)的机器上是不能直接运行的,需要另外安装MFC的动态链接库(如mfc90.dll)。
DLL编程入门

用C++进行DLL编程入门一、编写第一个入门级dll文件1. 新建一个dlltest的dll工程,加入一源文件dlltest.cpp,包含add和subtract两个函数如下:_declspec(dllexport) int add(int a,int b){return a+b;}_declspec(dllexport) int subtract(int a,int b){return a-b;}//----------------------------------------------------------------注意:在函数名前加上_declspec(dllexport),这样编译后在连接的时候才会生成dlltest.lib (引入库文件)和dlltest.exp(输出库文件),并且在命令提示符下用dumpbin命令可以看到导出了哪些函数。
方法:在命令提示符下,转到dll文件所在目录下,输入dumpbin –exports dlltest.dll,列出导出函数如下:这里注意到函数名字已经被改成了?add@@YAHHH@Z,这种现象叫做名字粉碎,是为了支持函数重载而做的。
2.编写一个基于对话框的MFC程序测试DLL,工程名为calldll,放置两个按纽add和subtract,响应按纽消息,调用这个DLL的add和subtract函数。
先添加响应按钮消息的函数OnAdd和OnSubtract,然后在函数所在源文件中写完整函数体如下://extern int add(int,int);//extern int subtract(int,int);_declspec(dllimport) int add(int,int);_declspec(dllimport) int subtract(int,int);void CCalldllDlg::OnAdd(){// TODO: Add your control notification handler code hereCString str;str.Format("2+3=%d",add(2,3));MessageBox(str);}void CCalldllDlg::OnSubtract(){// TODO: Add your control notification handler code hereCString str;str.Format("3-2=%d",subtract(3,2));MessageBox(str);}//------------------------------------------------------------这里采用隐式链接的方式加载动态链接库:注意:要用关键字extern先声明这两个函数,表明这两个函数是在外部定义的(不过程序中将它注释掉了)。
Vb写dll基础

Visual Basic 编写DLL
编写一个简单的DLL
打开VB6.0,新建工程 选择ActiveX DLL
修改工程名,工程名将决定生成的DLL的名称,这里顺便把自动生成的类的名称也修改
在类中添加一个方法(sub,或function )来测试这个DLL
生成一个DLL
调用这个DLL
再新建一个Exe工程
在这个Exe工程里找到并引用刚才生成的DLL
在Exe工程里使用
生成Exe文件,并关闭Exe工程,运行此Exe文件,点击测试DLL
运行效果
关闭Exe,修改DLL工程的属性,并修改DLL的clsTest1.MyMsgbox 方法
重新编译生成新的DLL,并再次运行刚才的Exe文件,点击测试DLL 查看效果:
这说明一点,通过DLL我们不需要重新编写编译Exe文件,只要重新编译DLL文件即可在实际编程中,各个DLL各司其职,组成功能强大,分工明确的软件
比如QQ旋风
DLL公开函数、方法(直接调用,就像调用公共模块中的公共函数一样)
新建一个DLL,命名为test2,并设置自动生成的Class1 的Instancing 属性为
6- GlobalMultiUse(这个类的各种属性和方法可以象简单的全局函数那样被调用。
该类的实例不需要显式创建,因为它会自动创建。
)
我们在这个Class1 中写入一个函数
生成DLL文件
再新建一个Exe工程,并引用这个DLL,然后调用这个DLL的函数进行测试
运行效果:。
C编写通达信Dll动态库文件

C编写通达信Dll动态库文件之前都是用MFC写通达信用DLL文件,MFC基本属于被淘汰工具,正好昨天新装VS2019,就试着用VS2019 C++动态库编写通达信用的DLL文件。
操作步骤如下:1.打开VS2019,新建一个项目,项目名称tdxDllTest,,新建项目时选择“动态链接库”,如下图:选择DLL项目名称:tdxDllTest新建的项目2.在新建项目中添加通达信DLL编程规范中的文件,此例是将规范中三个文件合并成两个,操作见下图:工程项目名称右键---添加---现有项,(需先将规范中实例的文件加入项目中)添加文件添加头/源文件3.在PluginTCalcFunc.cpp源文件中修改代码如下图:添加修改功能函数函数放入全局数组4.源代码:PluginTCalcFunc.h头文件:#ifndef __PLUGIN_TCALC_FUNC#define __PLUGIN_TCALC_FUNC#pragma pack(push,1)//函数(数据个数,输出,输入a,输入b,输入c)typedef void(*pPluginFUNC)(int,float*,float*,float*,float*);typedef struct tagPluginTCalcFuncInfo{unsigned short nFuncMark;//函数编号pPluginFUNC pCallFunc;//函数地址}PluginTCalcFuncInfo;typedefBOOL(*pRegisterPluginFUNC)(PluginTCalcFuncInfo**);//===================================== ==#ifdef __cplusplusextern 'C'{#endif //__cplusplus__declspec(dllexport) BOOL RegisterTdxFunc(PluginTCalcFuncInfo** pFun);#ifdef __cplusplus}#endif //__cplusplus#pragma pack(pop)#endif====================================== =PluginTCalcFunc.cpp源文件#include 'pch.h'#include 'PluginTCalcFunc.h'/*typedef void(*pPluginFUNC)( int DataLen,float* pfOUT,float* pfINa,float* pfINb,float* pfINc)类型指针;函数参数分别是(数据个数,输出,输入a,输入b,输入c),参数的计算是基于长度为DataLen 的float类型数组。
tdxdll文件编写讲解

tdxdll文件编写讲解一、什么是tdxdll文件?tdxdll文件是指通达信软件的动态链接库文件,具有扩展通达信软件功能的作用。
通达信软件是一款国内常用的股票分析软件,而tdxdll文件则可以通过编写相应的代码来实现对通达信软件的功能扩展。
二、tdxdll文件的编写过程1. 确定功能需求:在编写tdxdll文件之前,首先需要明确自己想要实现的功能,例如添加指标、自定义公式等。
2. 学习相关知识:为了编写tdxdll文件,需要熟悉通达信软件的相关编程接口和函数,以及编程语言的基础知识。
3. 创建代码文件:根据编程语言的要求,创建一个新的代码文件,并将其保存为tdxdll文件的格式。
4. 编写代码:根据功能需求,编写相应的代码逻辑。
在编写过程中,可以调用通达信软件提供的接口函数,以实现对软件功能的扩展。
5. 调试和测试:完成代码编写后,需要进行调试和测试,确保其功能的正确性和稳定性。
6. 发布和使用:将编写好的tdxdll文件发布,并在通达信软件中使用。
通达信软件会加载tdxdll文件,并将其功能应用于软件中。
三、常见功能实现示例1. 添加指标:通过编写tdxdll文件,可以向通达信软件中添加自定义的技术指标,以满足个人的分析需求。
2. 自定义公式:通达信软件中的公式是根据一定的规则进行计算的,通过编写tdxdll文件,可以添加自定义的公式,用于更精准的股票分析。
3. 数据导入导出:通过tdxdll文件,可以实现将通达信软件中的数据导出到外部文件,或将外部文件中的数据导入到通达信软件中进行分析。
4. 自动化交易:通过编写tdxdll文件,可以实现与交易接口的对接,从而实现自动化交易策略的执行。
5. 数据分析和统计:利用tdxdll文件,可以对通达信软件中的股票数据进行更深入的分析和统计,以辅助投资决策。
四、编写tdxdll文件的注意事项1. 了解通达信软件的版本和接口规范,确保编写的tdxdll文件与软件版本相匹配。
dll文件生成方法

dll文件生成方法
DLL(动态链接库)文件的生成可以通过多种方式,其中一种简单的方法是通过 Microsoft Visual Studio 这样的集成开发环境(IDE)进行。
下面是详细的步骤:
1. 创建环境:首先,确保你已经安装了 Microsoft Visual Studio。
其他版本的 Visual Studio(如 Visual Studio 2022)也可以,但步骤大致相同。
2. 创建 DLL 项目:
打开 Visual Studio。
选择“新建项目”。
在项目模板中选择“DLL”。
输入 DLL 的名称,然后点击“确定”。
3. 编写 DLL 代码:在创建的项目中,你可以开始编写 DLL 的代码。
一个简单的 DLL 可能包含一个导出函数。
4. 编译 DLL:
在 Visual Studio 中,点击“生成”菜单,然后选择“生成解决方案”或直接按 F7 键。
5. 检查生成的 DLL:编译成功后,可以在项目文件夹的“Debug”或“Release”子文件夹下找到生成的 DLL 文件。
6. 测试 DLL:为了测试 DLL 是否正常工作,你可以创建一个新的Windows 应用程序项目,并在其中调用你的 DLL。
7. 分发 DLL:如果你想将 DLL 分发给其他人,只需将 DLL 文件和任何依赖项一起打包即可。
请注意,这只是生成 DLL 的其中一种方法。
还有其他工具和平台(如 Linux)可以使用,具体取决于你的需求和环境。
编写C语言DLL,及C调用DLL(VS2010)

一、编写Dll文档1.新建一DLL项目dll2.#include"stdafx.h"#include"windows.h"#include"dll.h"#pragma comment(lib,"dll.lib")int _tmain(int argc, _TCHAR* argv[]){HelloWorld();return 0;}3.// dllmain.cpp : 定¡§义°? DLL 应®|用®?程¨¬序¨°的Ì?入¨?口¨²点Ì?。
¡ê#include"stdafx.h"#include"dll.h"#include<windows.h>#include<stdio.h>#include<stdlib.h>void HelloWorld (){MessageBox (0, L"Hello World from DLL!\n", L"Hi", MB_ICONINFORMATION);}BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,DWORD reason /* Reason this function is beingcalled. */ ,LPVOID reserved /* Not used. */ ){switch (reason){case DLL_PROCESS_ATTACH:break;case DLL_PROCESS_DETACH:break;case DLL_THREAD_ATTACH:break;case DLL_THREAD_DETACH:break;}/* Returns TRUE on success, FALSE on failure */return TRUE;}4.生成菜单下的重新生成解决方案,即得到dll和lib文件,如图:至此DLL文件建立完成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.dll文件编写悬赏分:0 |解决时间:2006-5-20 14:56 |提问者:lzpyake最佳答案DLL是一种特殊的可执行文件。
说它特殊主要是因为一般它都不能直接运行,需要宿主程序比如*.EXE程序或其他DLL的动态调用才能够使用。
简单的说,在通常情况下DLL是经过编译的函数和过程的集合。
使用DLL技术主要有以下几个原因:一、减小可执行文件大小。
DLL技术的产生有很大一部分原因是为了减小可执行文件的大小。
当操作系统进入Windows时代后,其大小已经达到几十兆乃至几百兆。
试想如果还是使用DOS 时代的单执行文件体系的话一个可执行文件的大小可能将达到数十兆,这是大家都不能接受的。
解决的方法就是采用动态链接技术将一个大的可执行文件分割成许多小的可执行程序。
二、实现资源共享。
这里指的资源共享包括很多方面,最多的是内存共享、代码共享等等。
早期的程序员经常碰到这样的事情,在不同的编程任务中编写同样的代码。
这种方法显然浪费了很多时间,为了解决这个问题人们编写了各种各样的库。
但由于编程语言和环境的不同这些库一般都不能通用,而且用户在运行程序时还需要这些库才行,极不方便。
DLL的出现就像制定了一个标准一样,使这些库有了统一的规范。
这样一来,用不同编程语言的程序员可以方便的使用用别的编程语言编写的DLL。
另外,DLL还有一个突出的特点就是在内存中只装载一次,这一点可以节省有限的内存,而且可以同时为多个进程服务。
三、便于维护和升级。
细心的朋友可能发现有一些DLL文件是有版本说明的。
(查看DLL文件的属性可以看到,但不是每一个DLL文件都有)这是为了便于维护和升级。
举个例子吧,早期的Win95中有一个BUG那就是在闰年不能正确显示2月29日这一天。
后来,Microsoft发布了一个补丁程序纠正了这个BUG。
值得一提的是,我们并没有重装Win95,而是用新版本的DLL代替了旧版本的DLL。
(具体是哪一个DLL文件笔者一时想不起来了。
)另一个常见的例子是驱动程序的升级。
例如,著名的DirectX就多次升级,现在已经发展到了6.0版了。
更妙的是,当我们试图安装较低版本的DLL时,系统会给我们提示,避免人为的操作错误。
例如我们升级某硬件的驱动程序时,经常碰到Windows提示我们当前安装的驱动程序比原来的驱动程序旧。
四、比较安全。
这里说的安全也包括很多方面。
比如,DLL文件遭受病毒的侵害机率要比普通的EXE文件低很多。
另外,由于是动态链接的,这给一些从事破坏工作的“高手”们多少带来了一些反汇编的困难。
第二章在Delphi中编写DLL top注意:在这里笔者假定读者使用的是Delphi 3或Delphi 4开场白说了那么多,总该言归正传了。
编写DLL其实也不是一件十分困难的事,只是要注意一些事项就够了。
为便于说明,我们先举一个例子。
library Delphi;usesSysUtils,Classes;function TestDll(i:integer):integer;stdcall;beginResult:=i;end;exportsTestDll;beginend.上面的例子是不是很简单?熟悉Delphi的朋友可以看出以上代码和一般的Delphi程序的编写基本是相同的,只是在TestDll函数后多了一个stdcall参数并且用exports语句声明了TestDll函数。
只要编译上面的代码,就可以得到一个名为Delphi.dll的动态链接库。
现在,让我们来看看有哪些需要注意的地方。
一、在DLL中编写的函数或过程都必须加上stdcall调用参数。
在Delphi 1或Delphi 2环境下该调用参数是far。
从Delphi 3以后将这个参数变为了stdcall,目的是为了使用标准的Win32参数传递技术来代替优化的register参数。
忘记使用stdcall参数是常见的错误,这个错误不会影响DLL的编译和生成,但当调用这个DLL时会发生很严重的错误,导致操作系统的死锁。
原因是register参数是Delphi的默认参数。
二、所写的函数和过程应该用exports语句声明为外部函数。
正如大家看到的,TestDll函数被声明为一个外部函数。
这样做可以使该函数在外部就能看到,具体方法是单激鼠标右键用“快速查看(Quick View)”功能查看该DLL文件。
(如果没有“快速查看”选项可以从Windows CD上安装。
)TestDll函数会出现在Export Table栏中。
另一个很充分的理由是,如果不这样声明,我们编写的函数将不能被调用,这是大家都不愿看到的。
三、当使用了长字符串类型的参数、变量时要引用ShareMem。
Delphi中的string类型很强大,我们知道普通的字符串长度最大为256个字符,但Delphi中string类型在默认情况下长度可以达到2G。
(对,您没有看错,确实是两兆。
)这时,如果您坚持要使用string类型的参数、变量甚至是记录信息时,就要引用ShareMem单元,而且必须是第一个引用的。
既在uses语句后是第一个引用的单元。
如下例:usesShareMem,SysUtils,Classes;还有一点,在您的工程文件(*.dpr)中而不是单元文件(*.pas)中也要做同样的工作,这一点Delphi自带的帮助文件没有说清楚,造成了很多误会。
不这样做的话,您很有可能付出死机的代价。
避免使用string类型的方法是将string类型的参数、变量等声明为Pchar或ShortString(如:s:string[10])类型。
同样的问题会出现在当您使用了动态数组时,解决的方法同上所述。
第三章在Delphi中静态调用DLL top调用一个DLL比写一个DLL要容易一些。
首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较。
同样的,我们先举一个静态调用的例子。
unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics,Controls, Forms, Dialogs, StdCtrls;typeTForm1 = class(TForm)Edit1: TEdit;Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}//本行以下代码为我们真正动手写的代码function TestDll(i:integer):integer;stdcall;external ’Delphi.dll’;procedure TForm1.Button1Click(Sender: TObject);beginEdit1.Text:=IntToStr(TestDll(1));end;end.上面的例子中我们在窗体上放置了一个编辑框(Edit)和一个按钮(Button),并且书写了很少的代码来测试我们刚刚编写的Delphi.dll。
大家可以看到我们唯一做的工作是将TestDll函数的说明部分放在了implementation中,并且用external语句指定了Delphi.dll的位置。
(本例中调用程序和Delphi.dll在同一个目录中。
)让人兴奋的是,我们自己编写的TestDll函数很快被Delphi认出来了。
您可做这样一个实验:输入“TestDll(”,很快Delphi就会用fly-by提示条提示您应该输入的参数是什么,就像我们使用Delphi中定义的其他函数一样简单。
注意事项有以下一些:一、调用参数用stdcall。
和前面提到的一样,当引用DLL中的函数和过程时也要使用stdcall参数,原因和前面提到的一样。
二、用external语句指定被调用的DLL文件的路径和名称。
正如大家看到的,我们在external语句中指定了所要调用的DLL文件的名称。
没有写路径是因为该DLL文件和调用它的主程序在同一目录下。
如果该DLL文件在C:\,则我们可将上面的引用语句写为external ’C:\Delphi.dll’。
注意文件的后缀.dll必须写上。
三、不能从DLL中调用全局变量。
如果我们在DLL中声明了某种全局变量,如:var s:byte 。
这样在DLL中s这个全局变量是可以正常使用的,但s不能被调用程序使用,既s不能作为全局变量传递给调用程序。
不过在调用程序中声明的变量可以作为参数传递给DLL。
四、被调用的DLL必须存在。
这一点很重要,使用静态调用方法时要求所调用的DLL文件以及要调用的函数或过程等等必须存在。
如果不存在或指定的路径和文件名不正确的话,运行主程序时系统会提示“启动程序时出错”或“找不到*.dll文件”等运行错误。
第四章在Delphi中动态调用DLL top动态调用DLL相对复杂很多,但非常灵活。
为了全面的说明该问题,这次我们举一个调用由C++编写的DLL的例子。
首先在C++中编译下面的DLL源程序。
#includeext ern ”C” _declspec(dllexport)int WINAPI TestC(int i){return i;}编译后生成一个DLL文件,在这里我们称该文件为Cpp.dll,该DLL中只有一个返回整数类型的函数TestC。
为了方便说明,我们仍然引用上面的调用程序,只是将原来的Button1Click过程中的语句用下面的代码替换掉了。
procedure TForm1.Button1Click(Sender: TObject);typeTIntFunc=function(i:integer):integer;stdcall;varTh:Thandle;Tf:TIntFunc;Tp:TFarProc;beginTh:=LoadLibrary(’Cpp.dll’); {装载DLL}if Th>0 thentryTp:=GetProcAddress(Th,PChar(’TestC’));if Tp<>nilthen beginTf:=TIntFunc(Tp);Edit1.Text:=IntToStr(Tf(1)); {调用TestC函数}endelseShowMessage(’TestC函数没有找到’);finallyFreeLibrary(Th); {释放DLL}endelseShowMessage(’Cpp.dll没有找到’);end;大家已经看到了,这种动态调用技术很复杂,但只要修改参数,如修改LoadLibrary(’Cpp.dll’)中的DLL名称为’Delphi.dll’就可动态更改所调用的DLL。