当前位置:文档之家› 在Delphi中实现窗体的DLL封装

在Delphi中实现窗体的DLL封装

在Delphi中实现窗体的DLL封装
在Delphi中实现窗体的DLL封装

Computer Knowledge and Technology 电脑知识

与技术本栏目责任编辑:谢媛媛软件设计开发第6卷第14期(2010年5月)在Delphi 中实现窗体的DLL 封装

何定华

(武汉职业技术学院计算机系,湖北武汉430074)

摘要:为了实现函数和其它资源的共享,我们可以在Delphi 中将窗体封装到DLL 中,窗体的DLL 封装对不同程序、不同语言进行资源共享非常有意义。

关键词:DLL ;窗体;封装;调用;Delphi

中图分类号:TP311文献标识码:A 文章编号:1009-3044(2010)14-3636-02

The Implementation of Windows'DLL Encapsulation in Delphi

HE Ding-hua

(Department of Computer,Wuhan Institute of Technology,Wuhan 430074,China)

Abstract:In Delphi,we can enclose the window in DLL to implement sharing of function with other resources.Enclosure of windows in DLL is significant for sharing of resources among different programs and languages.

Key words:DLL;windows;encapsulation;call;Delphi

动态链接库DLL (Dynamic Link Library )是一些编译过的可执行代码。在Windows 环境中使用DLL 可以实现多个应用程序间的代码和资源共享。DLL 独立于语言,在Windows 编程环境中允许程序员调用存储在DLL 中的函数或者其它资源。也就是说使用Delphi 开发的DLL ,在Visual Basic 、C 、Fortran 等其它开发语言中可以直接调用。Delphi 擅长界面设计,如果使用Delphi 把界面窗体设计好并封装在DLL 中,供那些不擅长界面设计的开发语言使用将是一件非常有意义的事情。

下面我们以模式窗体为例讲述封装窗体(下面我们称之为DLL 窗体)到DLL 的方法。本DLL 窗体的功能是:在DLL 窗体中输入两个整数,实现两个整数相加,并把它们的和数返回给调用该DLL 的Windows 应用程序。

利用DLL Wizard 新建一个DLL 项目,并新建一个名为DLLForm 窗体,在窗体中添加两个edit 组件edit1和edit2,添加一个button 组件button1。下面是该DLL 的代码清单:

library AddtwoLib;

uses

ShareMem,

//ShareMem 是内存管理器的接口单元,必不可少,且必须是uses 子句中的第一个单元

SysUtils,

Classes,

DLLFrm in 'DLLFrm.pas'{DLLForm};

exports

//exports 指示被应用程序调用的函数或过程

Addtwo;

begin

end.

下面是DLLFrm.pas 单元中的代码:

unit DLLFrm;

interface

uses

WinTypes,Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,WinProcs;

type

TDLLForm =class(TForm)

Edit1:TEdit;

Button1:TButton;

Edit2:TEdit;

procedure Button1Click(Sender:TObject);

private

{Private declarations }

public

{Public declarations }

收稿日期:2010-03-24

作者简介:何定华(1972-),男,湖北监利人,副教授,教研室主任,主要研究方向为管理信息系统,数据安全。

ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.6,No.14,May 2010,pp.3636-3637,3648E-mail:xsjl@https://www.doczj.com/doc/8b11468293.html, https://www.doczj.com/doc/8b11468293.html, Tel:+86-551-569096356909643636

Computer Knowledge and Technology 电脑知识与技术软件设计开发本栏目责任编辑:谢媛媛第6卷第14期(2010年5月)end;

function Addtwo(AHandle:THandle;ACaption:string):integer;stdcall;

implementation

{$R *.dfm}

function Addtwo(AHandle:THandle;ACaption:string):integer;stdcall;

var

DLLForm:TDLLForm;

//窗体声明在函数内部,这样随着函数的调用窗体被显示

begin

Application.Handle:=Ahandle;

DLLForm:=TDLLForm.Create(Application);

try

DLLForm.ShowModal;

//以模式窗体形式显示窗体

Result:=strtoint(DLLForm.Edit1.Text)+strtoint(DLLForm.Edit2.Text);//函数值

finally

DLLform.Free;

end;

end;

procedure TDLLForm.Button1Click(Sender:TObject);

begin

close;

end;

end.

说明:DLL 窗体被包括进了函数,它是在函数内部声明的。在函数Addtwo 被调用的时候将以模式窗体的形式显示出来。具体是这样操作的:Addtwo 函数首先将Ahandle 参数传递给Application.Handle 。然后DLL 窗体DLLForm 再以模式窗体的形式显示出来。最后计算出函数值,函数值为在DLL 窗体中输入的两个整数之和。

函数“function Addtwo(AHandle:THandle;ACaption:string):integer;stdcall;”之后的stdcall 表示函数的默认调用方法。调用Windows API 一般使用这种调用方法。

Build Project1生成Project.DLL 文件,将Project.DLL 文件复制到Windows 系统目录。供Windows 应用程序调用。

下面讲述该DLL 窗体的调用方法。新建一个Application 应用程序,在窗体中添加按钮button1和编辑框edit1以及标签label1。代码清单如下:

unit Unit1;

interface

uses

Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,

Dialogs,StdCtrls,WinTypes,WinProcs;

type

TAddtwo=function(AHandle:THandle;ACaption:String):integer;stdcall;

TForm1=class(TForm)

Button1:TButton;

Label1:TLabel;

Edit1:TEdit;

procedure Button1Click(Sender:TObject);

private

{Private declarations }

public

{Public declarations }

end;

var

Form1:TForm1;

implementation

{$R *.dfm}

Procedure TForm1.Button1Click(Sender:TObject);

var

LibHandle:THandle;

Addtwo:TAddtwo;

begin

libhandle:=loadlibrary('Project1.dll');

//装载Project1.dll 到内存

if Libhandle<>0Then

//装载成功

begin

(下转第3648页)3637

Computer Knowledge and Technology 电脑知识与技术

本栏目责任编辑:谢媛媛软件设计开发第6卷第14期

(2010年5月)(上接第3637页)

@Addtwo:=getprocaddress(Libhandle,'Addtwo');

//得到内存中函数Addtwo 的入口地址

if @Addtwo<>nil

//找到函数则调用函数

then edit1.Text:=inttostr(Addtwo(Application.Handle,Caption))

else showmessage('找不到函数!');end

else showmessage('找不到DLL 文件!');

end;

end.

说明:loadlibrary('Project1.dll')用于将Project1.dll 装入内存,如果装载成功将返回一个非0

值。如果装载成功将执行语句@Addtwo:=getprocaddress(Libhandle,'Addtwo'),该语句用于得到内

存中函数Addtwo 的地址,如果地址@Addtwo 不为nil 表示找到函数。找到函数之后调用函数,将结果显示在应用程序的edit1中。

程序运行结果如图1和图2所示。其中,图1中由应用程序调用DLL 窗体,由DLL 窗体实

现函数功能求两个数的和。图2是DLL 窗体返回函数值给应用程序。

使用DLL 封装窗体,不仅有利于程序的模块化,使软件产品更易于维护和升级,还有利于多人合作完成同一个项目。此外还可以在多种语言之间实现混合编程,例如在工程上可以使用Delphi 制作界面(DLL 窗体)实现数据的录入,然后再使用Fortran 接受输入的数据并进行工程计算,最后还可以将结果显示在Delphi 设计的界面(DLL 窗体)上,这将大大地改善程序的界面友好性。参考文献:

[1]陈省.Delphi 深度探索[M].2版.北京:电子工业出版社,2002.

[2]刘艺.Delphi 模式编程[M].北京:机械工业出版社,2004.

[3]梁冰,李钟尉.Delphi 技术方案宝典[M].北京:人民邮电出版社,2008.

图1应用程序调用DLL 窗体图2DLL 窗体返回函数值在这个基于云计算模型的遥感数据处理系统

中我们设计使用的是云端强大的计算能力,突破

传统的计算模式。

由于云计算模型从理论走向实验还有一个过

程,这个实验现阶段没办法完成。武汉大学研制并

开发的“数字摄影测量网格系统一DPGrid ”突破了

传统的计算模式,其发展思路是新一代计算模式的体现,其实验的数据对于我们本次的实验有很大的重要的意义,能够对多组数据进行了生产实验和效率对比。

表1为DPGrid 系统(8台刀片服务器)与传统数字摄影测量工作站生产效率对比表。从实验5可以看出,一个中等城市(3000km 2),6000幅DMC 航空数码影像,8台刀片服务器,仅需要15天即可生成影像镶嵌图。而相同的数据,按照传统作业方式制作正射影像图,需要10个以上的工作人员一年以上的时问。同时由表1可以看出,镶嵌图耗时最短,因而可满足快速响应的需求。同时并行计算的效率比传统串行计算的效率提高了3—10倍,并且影像数越多,效率提高的越多。云计算平台具有更加庞大的服务器群,计算能力更加强大,相比DPGrid 系统有更大的运行效率,这将使得海量的遥感数据处理得更加准确、及时。

5结论

云计算是一种颠覆性的技术具有深刻意义,不仅对互联网服务,而且对这个IT 业都是一次革命。将它应用在遥感领域更是一种大胆的尝试,作为遥感处理专业领域,如何进行海量数据存储与处理、系统的扩展与开放等是该领域长期的瓶颈,云计算的出现给解决这些问题带来了希望。本文详细探讨了遥感云计算的系统构成和实现方法,并以一个具体的原型系统展现了遥感云计算模式的用户界面、技术手段和运行流程。

参考文献:

[1]刘异,呙维,江万寿,等.一种基于云计算模型的遥感处理服务模式研究与实现[J].计算机应用研究,2009,26(9):3428-3431.

[2]测绘发展研究动态,2009(4).

[3]张剑清,柯涛,孙明伟.基于集群计算机的海量航空数码影像并行处理———

并行计算在航空数字摄影测量中的应用[J].计算机工程与应用,2008,44(13):12-15.

[4]王鹏.走进云计算[M].北京:人民邮电出版社,2009.

[5]张剑清,潘励,王树根.摄影测量学[M].武汉:武汉大学出版社,2002.

[6]王之卓.摄影测量原理[M].北京:测绘出版社,1979.

表1DPGrid 系统与传统数字摄影测量工作站生产效率对比表

3648

MATLAB2014aC++代码生成,并用VC2010生成dll供VBA或VB调用使用说明

MATLAB2014a生成C++代码,并用VC2010生成dll 供VBA或VB调用使用说明 一、过程概述 1、使用VC2010生成.dll文件,测试VC程序是否正常 2、使用VBA调用VC2010生成的.dll文件,测试.dll文件调用的VBA代码是否 正常,这里使用Excel VBA主要是为了以后输入输出数据更方便。 3、使用MATLAB编写脚本程序文件,使用MATLAB CODER功能编译成c++文件。 4、VC2010集成MATLAB生成的c++代码,并编译成.dll文件 5、使用步骤1,2验证MATLAB生成的代码 二、具体实施过程描述 1、使用VC2010生成.dll文件 1.1工程建立 首先打开VS 2010--> 新建工程 --> Win32 --> Win32项目 --> 输入工程名称(MakeDll),选择好保存工程的路径-->确定。 在弹出的“应用程序设置”--> "应用成程序型" --> 选择 "DLL(D)" --> 附加选项-> 选择"空项目(E)" ---->点击"完成"进入项目工作窗口

1.2开始创建DLL 第一步: 在头"解决方案资源管理器" --> 头文件 --> 右键 -->添加新建项 ---→选择"头文件(.h)" -->输入文件名称(max) --> 点击“添加(A)”,完成max.h文件的添加。

max.h头文件中的代码为: 1. #ifndef _MAX_H 2. #define _MAX_H_ 3. __declspec(dllexport) int __stdcall fmax(int a,int b); 4. #endif 代码说明: __declspec(dllexport) 的作用是指定导出该函数为DLL函数; __stdcall是函数调用约定,表示该DLL函数被C/C++以外的语言调用; 备注:使用时需要根据实际定义的主函数返回值类型和函数名称修改低3行红色而自体标记部分内容。这里需要修改的是int数据类型,fmax(int a,int b)的函数名称和变量名称和变量的类型,或者直接从第二步的主程序中复制过来。 第二步: 在头"解决方案资源管理器" --> 源文件 --> 右键 -->添加新建项 -->选择"C++文件(.cpp)" -->输入文件名称(max) --> 添加(A) max.c源文件中的代码为:

VB封装Excel_VBA成DLL技巧

VB封装Excel_VBA成DLL技巧 VB封装Excel_VBA成DLL技巧 使用VB6.0在WinXP_sp2、Excel 2000环境下制作、测试通过。一、启动VB6.0:执行:“文件夹(F)”——“新建(N)”——选择“ActiveX DLL”,如下图1:二、引用:VB 中对Excel的引用执行:“工程(P)”——“引用(N)”——选择所要引用的项目:如下图2 Excel 2000中: Microsoft Excel 9.0 Object Library Microsoft Office 9.0 Object LibraryExcel 2003中:Microsoft Excel 11.0 Object Library Microsoft Office 11.0 Object Library三、编写代码: 1、将工程默认名称“工程1”,改为“zygtest”,将类模块默认名称“Class1”, 改为“zyg365”, 2、在类模块的代码编辑区写入代码:如下图3 模块名称为“hongtong”,代码如下在VB中编写代码时:要注意以下声名 Dim XLAPP As Object Set XLAPP = GetObject(, "Excel.Application") 代码中引用对象,如SHEET,Cell等,前面要加“XLAPP.”

(或按照Sub hongtong() 中的格式编写。)Sub hongtong() Dim excelApp As New Excel.Application Dim excelWorkBook As Excel.Workbook Dim excelWorksheet As Excel.Worksheet Set excelWorkBook = excelApp.Workbooks.Add '创建新工作簿 Set excelWorksheet = excelWorkBook.Sheets(1) excelWorksheet.Cells(2, 3) = "宏通" '写入数据excelWorksheet.Cells(3, 4) = "zyg365" '写入数据excelApp.Visible = True '显示excel界面,用于调试excelWorkBook.PrintPreview '打印预览 excelWorkBook.PrintOut '打印输出 excelWorkBook.Saved = True 'excelWorkBook.Close '关闭工作薄 'excelApp.Quit '退出excel End Sub四、工程属性设置:(可以不设置,本步骤可以省略) 为了使自己开发的程序更规范,可以对本工程的属性加以描述:如下图4 执行:“工程(P)”——“工程1属性(E)…”(当前工程中为:“zygtest属性(E)…”)五、保存工程、测试、打包生成Dll文件:

在VB中调用DLL的方法

1制作好DLL之后,就可以用VB调用它,实现VB调用C程序。VB程序要使用DLL中的函数,首先必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。 语句格式为:Declare Sub过程名Lib[Alias"别名]([ByVal参数AS类型]),或为Declare Function函数名Lib[Alias"别名]([ByVal参数AS类型])AS类型在声明中首先用Declare 关键字表示声明DLL中的函数。在C语言中有的函数类型为VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。有的函数具有返回值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关键字指明函数返回值的类型。 例如上面的ADD.DLL在VB中就可以声明为: Declare Function ADD Lib“c:\ADD.dll”(ByVal X AS Integer,ByVal Y AS Integer,ByVal filein asstring)AS Integer 通过此声明语句将函数ADD声明到VB中,便可直接调用。 2、dll文件中的函数好像是C语言写的, //函数名:int__stdcall GetMacNo(int*MacNo) //功能:获取卡机的卡机号(单机时) //参数:MacNo[0]-被读出的卡机号 //返回值:0-成功, //2-PC接收超时, //3-应答错误 dll的文件名是COMM232.dll 函数的形参int*MacNo是指针吗? 在VB中应该怎么声明和调用该函数? VB里也可以定义指针吗? 问题补充:vb调用dll文件中的函数我是会的,但这儿的形参有一个星号才不知是怎么一回事, 我是这样声明的对吗? Public Declare Function GetMacNo Lib"COMM232.dll"(ByVal MacNo As Integer)As Integer 又应该怎么调用呢?要先定义一个指针的变量再传给*MacNo还是要怎么做? 都说了MacNo是被读出的卡机号,那么就是传址的了。 dim l as integer dim m as integer l=GetMacNo(m) if l=0then label1.caption="卡机号:"&m elseif l=2then msgbox"PC接收超时" elseif l=3then msgbox"应答错误" end if

VB封装VBA文件

VB中的类开发 对程序员和编程爱好者来说,VB中类的技术是学习中的一个难点,在大型软件的开发过程中,模块(Moudle)、控件(Active moudle)构成了系统化、高效化的软件工程,而类的技术是控件和链接库技术的基础,因此掌握类的理论和编程方法是非常有意义的。 (一)类的基本定义和应用概述; 类是包含了方法、属性、数据成员的高级代码模块,它既在模块的范畴之内,又是一个没有图形界面的Active ocx,程序员可以象使用控件一样使用它,但却不能看到它,值得注意的是,类是不能继承的。 类能够使我们高效的完成对某一个或者某几个特定的对象的复杂操作,对象的动作就是类的方法,对象的属性就是类的属性过程。相对而言,如果编程的对象是一组事物,那么,我们采用标准模块的方式是非常合适的,在下列两种情况下,应该使用类进行代码处理: (1)创建大量性质相近的对象; (2)提高代码的封装性。 类的创建非常简单,在进行代码编写的时候,在“工程”菜单中选择“添加类模块”项目,就可以添加一个空白的类。 类文件一般以.cls作为扩展名保存。 (二)类的方法的实现; 类的方法类似于动态链接库的接口函数,它能够接受其他窗体代码的指定类型参数,并且传递到类中。一般来说类的方法是能够指定是否有返回值的。它在类中通常是一个public过程。请看下面的代码示例,它使一个密码框拒绝非字母的输入: (1)类cls的代码; Option Explicit'变量检查 Private WithEvents mytxt As TextBox '本类中的方法接受和控制一个text密码框 Dim isNUM As Boolean '类的模块级变量 Public Sub Attach(itTEXT As TextBox) '接受外部变量到mytxt中 Set mytxt = itTEXT End Sub Private Sub mytxt_KeyUp(KeyCode As Integer, Shift As Integer) isNUM = (KeyCode > = 65) And (KeyCode < = 90) '测试密码框的键盘输入是否是英文字母

java调用C#封装的dll方法

Java调用C# DLL的方法简介 By 潘伟2012-8-7 关于java调用C# 封装的DLL文件的方法 第一种:java利用JNA进行调用 思路:C#源码生成COM组件(dll和tlb文件),再利用C++进行封装,java通过JNA调用C++封装的DLL。 第二种:java利用jacob进行调用 第一种java利用JNA调用C# DLL 需安装Visual Studio 2010 ,下载jna.jar(解压放置于jdk_home/jre/lib/ext目录下)。 第一步:利用C#写COM组件 1、新建一个类库项目(文件—新建—项目—类库;命名:COMTest);//根据实际需要取文件名 2、生成.cs主文件; COMTestClass.cs

3、右键点击工程->应用程序->程序集信息->使程序集com可见,打上勾

4、右键点击工程->生成->为com Interop注册打上勾 5、设置强签名 (由于.Net下编译的COM组件并等同于C编译的COM组件,所以存在必须在运行目标机器注册的情况,对此.Net下编译的COM组件必须为程序进行签名,即强命名密钥;) 打开Visual Studio Command Prompt 输入:sn -k MyKeyFire.snk 生成MyKeyFire.snk 文件,注意路径。(.snk文件可以随意取,但.snk后缀名别忘记了) 在签名标签中选中为程序集签名,选择刚刚生成的强名称文件MyKeyFire.snk 。

6、在“解决方案资源管理器”中找到节点“Properties”打开AssemblyInfo.cs文件 如下图 7、将[assem bly: Com Visible(false)]属性改成[assem bly: Com Visible(true)] 如下图 8、编译程序,\bin\Debug目录中会生成COMTest.dll 和COMTest.tlb文件。 第二步:利用C++进行再封装 1、创建C++ DLL项目,新建项目->VC++->Win32 项目(名称:COMTest_Bridge)->下一步->应用程 序类型:DLL 2、添加类,类名:COMTest_Bridge,.h名:COMTest_Bridge.h,.cpp名:COMTest_Bridge.cpp, 然后生成项目; 3、把第一步生成的COMTest.dll 和COMTest.tlb文件放入C++项目下的Debug文件夹下。 4、注册COM组件: 4.1打开Visual Studio Command Prompt进入Debug目录,运行命令注册:

使用NetBox简单实现ASP封装为EXE带图的详细教程

使用NetBox简单实现ASP封装为EXE带图的详细教程 NetBox是一个使用脚本语言进行应用软件开发与发布的开发环境和运行平台,使用 NetBox,可以完全使用脚本语言(比如 VBScript,Javascript) 创建出稳定高效的应用软件,并且可以平滑移植到从 Windows 98 到 Windows .NET Server 的全部操作系统上。适用范围对于 WEB 应用,可以迅速将已有的iis+asp 的应用平滑移植到NetBox应用中,除极少数高级编程外,代码不需要任何修改,同时NetBox还提供大量扩展部件,使得 WEB 应用更加方便。由于NetBox可以将全部代码最终发布成为应用程序,保护了开发人员的利益和代码的完整性。同时,NetBox还可以方便地编写更多的桌面应用、系统服务器应用、定制网络应用等等。 运行环境要求NetBox的基本运行环境要求很低,最低要求只需要 Windows 98 或者 Windows NT + IE4 即可运行。而如果需要使用系统其他部件(比如ado),则需要根据系统情况,如果系统本身未缺省安装,需要自行安装。下面列出的是经过测试的所有系统平台: Windows 98 Windows 98 SE Windows ME Windows NT+IE4 Windows 2000 Windows XP Windows .NET Server 以上为该软件的说明文件内的内容。 简单的形容就是把ASP文件打包成一个EXE文件,并且不需要在调试的机器上安装IIS即可正常调试。如果按照说明书来操作的话,观看比较繁琐,本人为方便大家使用,现制作一个简单的使用教程。 封装过程 1、首先安装NetBox,安装时全部是英文界面,默认安装。 2、准备步骤: 2.1、在任意(如D)盘根目录下建立web文件夹(在哪个盘符下建立都可以,根据自己的喜好变换位置。); 2.2、把需要封装的ASP文件拷贝至D盘web文件夹下的wwwroot文件夹内(是

DELPHI中如何调用API,可举例说明

DELPHI中如何调用API,可举例说明 第一部分Delphi知识1. 如果一个元件希望放到IDE的元件面板上,它必须从________类派生,如果一个元件能作为其它元件的容器,它必须从_____________类派生,如果一个元件在运行时可见,它必须从___________________类派生(A)TGraphicControl (B)TWinContr 1、rtl70.bpl是什么?有什么用? 2、delphi的Package相对dll有什么优点? 3、以下的记录(结构)变量在内存占多少字节?type a = packed record v1: Byte; v2: Word; v3: string[16]; v4: Double; v5: string; v6: TForm; end; 4、以下的写法是否正确?type a 1.您为什么选择软件开发这个行业?(30字左右简写); 2.如果有您解决不了的软件问题您会采取什么样的解决措施; 3.a.请您写出Object Pascal所支持的数据类型;b.请您写出Shl、Shr、Xor、Not 的数学表示法; 4.请您写出VCL结构层次(以TObject开始,最少五层);5 二.是非题(共20道)1.从主菜单上选择Project|Syntax Check 菜单选项,Delphi将编译从上次编译后有改动的任何单元,并报出遇到的错误。()2.Delphi的VCL对象有些是指针,从堆栈中分配空间,有些则不是。()3.粘贴时,如果作为容器的组件已被选择,

剪贴 一.选择题(共40道)1.用户开发程序时需要经常在窗体和编辑器窗口之间来回切换,可使用快捷键()。A、F12和F11 B、F12和F13 C、F12和Ctrl+F12 D、F12和Alt+F12 E、F12和Shift+F12 2.某函数如下:Function check(n,k:Integer):Integer; Var m:Integer; Beg 编程语言:delphi7.0或Vc++6.0 时间:4小时内环境:可参考帮助文档,但不能上网查资料1、编程查找指定目录下所有EXE 文件,并将其全路径存入Result.txt中,要求用递归。2、采用SOCKET(可用SOCKET API或delphi Socket控件)实现点对点传输大文件,要求不能掉

c#数据库连接、操作、封装dll

c#数据库连接去sql server 为了简化数据库连接和操作,编写一个数据库dll文件也是比较有用的。只需要设置参数就可以完成数据库操作 属性 OUTPUTSTR 存储过程输出 CONSTR 数据库连接字符串 SQL_SLT 存储过程名或sql语句列表名 代码错误信息返回或连接关闭状态 public int sql_select(int cmdtype, int sqlst,int n) 数据库语句执行方法, cmdtype设置数据源执行的SQL语句或存储过程,即commandtype属性(0为text枚举,1为storedprocedure枚举,其他值为tabledirect枚举); sqlst设置执行SQL语句的方式,0为executenonquery方法执行,1为executereader 方法执行,其他为executescalar方法执行。设置存储过程参数个数。方法返回受 影响的行数 public Boolean Connopen() 打开数据库连接方法,返回bool值,true为打开,false 为未打开,并将未打开错误返回到EXSTR属性里 public void conn_close() 连接关闭方法,将关闭状态返回到EXSTR属性 public void sqlsp(string p1,string p2,string p3,int p4,int p5) 获取SqlParameter 对象参数,p1获取SqlParameter.ParameterName属性值,p2获取SqlParameter.sqldbtype属性值, p3获取SqlParameter.value属性值,p4获取SqlParameter.size属性值, p5设置SqlParameter.Directions属性值,0为ParameterDirection.Input、 1为ParameterDirection.InputOutput、2为ParameterDirection.Output、 大于3为ParameterDirection.ReturnValue public DataSet ds 返回查询结果集 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Data; using System.Collections; namespace connet { public class jdbccoonn { private string constr, exstr, sql_slt,outputstr; private static int q; public static int Q { get {

delphi之调用外部dll中的函数

分早绑定和晚绑定两种。 早绑定的代码如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; //MB 函数的声明: function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall; implementation {$R *.dfm} {调用外部 DLL 中的函数,譬如调用系统 user32.dll 中的 MessageBoxA} //function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; // stdcall; external user32 name 'MessageBoxA'; {其中 user32 是 Delphi 定义的常量 'user32.dll',可以直接写成:} //function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; // stdcall; external 'user32.dll' name 'MessageBoxA'; {name 后面说明函数的真实名字} {external 子句说明单元载入时就加载函数,也就是早绑定;如果晚绑定需要用LoadLibrary} {stdcall 指令表示参数传递是从右到左(Pascal则反之),不通过CPU寄存器

类封装成dll

如果你的工作长期与某个领域相关,比如说长期做直接体绘制 (DVR)方面的开发,那么你可能经常使用自己的传递函数类,如果每一个工程你都把传递函数类的.h和.cpp文件添加进去会比较麻烦,其实,我们可以像 使用opengl的库那样来用你自己的类,做法就是把你写好的类封装成dll,具体做法如下: 第一步:制作dll 利用VC6新建工程时选择win32 dynamic-Link Library(空的工程),然后添加头文件和cpp文件。假设你要封装的类的名成是TransferFunction,添加头文件 TransferFunction.h和TransferFunction.cpp到工程中。并将TransferFunction.h修改成: class __declspec(dllexport) TransferFunction { ... } 从而说明以后从dll要被导出的类是哪一个。这样编译完就会产生TransferFunction.dll和TransferFunction.lib两个文件。 第二步:如何使用这个dll 当已经生成dll后,有两种方法可以在其它程序中调用dll中的类和成员函数: 方法一: 1)把TransferFunction.dll和TransferFunction.lib复制到调用程序的执行路径下,注意不是debug路径下。 2)在project->setting->link里添加TransferFunction.lib(或者用 #pragma comment(lib, "TransferFunction.lib") ) 3)把TransferFunction.h中的__declspec(dllexport)改成 __declspec(dllimport) 然后复制到调用程序的执行路径下。 4)最后在主程序中就可以通过包含TransferFunction.h来使用TransferFunction类和它的成员函数。 方法二(推荐): 在方法一中,你每次建立一个工程都需要把 TransferFunction.dll,TransferFunction.lib,TransferFunction.h三个文件拷贝到工程里面 去,事实上这只发挥了dll对类的代码保护的功能,并没有多大的减轻编程人员的工作量,下面的方法可以减少编程人员的工作量,具体步骤:

易语言中调用DLL使用说明

易语言中调用DLL使用说明 基本说明 本文所描述的部分功能需易语言4.01或以上版本支持。 “在易语言中调用DLL”包含两方面的内容:调用Windows系统API函数;调用普通DLL函数。 下文用到的“调用API”或“调用DLL”等字眼,除非特别注明,一般都是指以上两方面之一或之和,视上下文而定。绝大多数情况下,无需明确区分调用的是系统API还是普通DLL。 目前易语言只支持以stdcall方式调用DLL中的导出函数。 Windows系统API一般都是以stdcall调用方式导出的,故在易语言中调用它们时通常不必考虑函数调用方式的问题。而普通DLL有可能导出“非stdcall调用方式”(比如cdecl)的函数,调用时需要特别注意。一般而言,考虑到通用性,DLL开发者都会选择导出以sdtcall方式调用的函数。(支持生成DLL的编程语言通常都支持导出stdcall调用方式的函数,具体实现请参考各编程语言手册。) 易语言编译生成的DLL,其导出函数全部为stdcall调用方式,所以在易语言中调用易语言生成的DLL不存在问题。 目前在易语言中调用DLL时只支持1字节对齐的结构(自定义数据类型) 如果DLL命令的某个参数或参数的某个成员是结构类型(自定义数据类型),则其对齐方式必须是1字节对齐。Windows系统API中所用到的结构都是1字节对齐的,故在调用API时不受此限制。但如果想用其它编程语言生成DLL供易语言调用且数据类型中包含了1或2字节数据长度的成员(如字符型或短整数),就需要考虑结构的1字节对齐。

在Delphi中,可以这样定义1字节对齐的结构(结构在Delphi中称为record): 在其它编程语言或编译器中的定义方式请参考各自的编程手册。 目前易语言支持调用任意复杂的DLL命令 只要满足了前面的两个条件——调用方式为stdcall,参数结构为1字节对齐——易语言支持调用任意复杂的DLL命令:参数除了可以是基本数据类型或普通结构类型外,还可以是基本类型地址或基本类型数组,也可以是结构类型地址或结构类型数组,结构类型的成员中还可以包含任意数量和任意层次的其它结构、结构地址、结构数组,等等。 DLL命令调用表 要在易语言中调用Windows API或普通DLL中的导出函数,必须首先在易语言中对该函数进行声明,声明的方式就是颇具易语言特色的“填写‘DLL命令调用表’”。“DLL命令调用表”正确填写完毕之后,就可以象调用普通易语言子程序一样调用DLL命令了。 下面重点说明“DLL命令调用表”的填写。 在易语言中,选择菜单“插入→DLL命令”即可插入一个空白的“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 Main If MsgBox("哈哈", vbOKCancel) = vbOK Then Shell "link2.exe " & Command$ End If End 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 Long mathadd = a + b End Function 编译这个工程,在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是: Link2.exe "e:\vbdll\Class1.obj" "e:\vbdll\Module1.obj" "e:\vbdll\Project1.obj" "E:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathadd /OUT:"e:\vbdll\ProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS 注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了,可以被其他语言引入,例如在VB中,只需要: Private Declare Function mathadd Lib "e:\vbdll\ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long

VB封装DLL实例讲解(三)

4 1 2点选DLL 3点打开按钮

5 2 3点选DLL 4点打开按钮

我们可以将注册语句放在窗体的加载事件,自动完成DLL的注册,具体可以参看实例。但如果我们有多个DLL需要批量注册时,可以考虑通过软件打包发布工具来完成DLL的注册工作;也可以事先编写BA T文件,让打包发布时将该BA T文件一并打包发布,安装时运行该BA T文件,来完成N个DLL的批量注册,在些就不多着笔墨,大家可以参看实例包中的BA T文件实例。 (二)DLL自动引用方法 2.1 通过References对象的AddFromFile方法实现自动引用 Dim ref As Reference '申明引用类对象 On Error Resume Next '避免因重复引用造成的错误提示 '实例化引用对象,完成DLL的引用 Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll") 为了避免因重复引用出现的错误,我们可以如上代码中加入Error语句,我们还可以在应用程序退出时,通过对References对象的Remove方法释放DLL或反引用。 Dim ref As Reference '申明引用类对象 '实例化反引用对象 Set ref = References("ClsFindString") '移除引用指定类库 References.Remove ref 说明:根据本人实践,我个人倾向于使用Error语句,因为如果应用程序非正常退出,引用对象没有反引用成功,启动时就难免出现重复引用的错误问题。 2.2 通过DLL唯一标识号实现自动引用 Dim ref As Reference'申明引用类对象 On Error Resume Next '避免因重复引用造成的错误提示 '唯一标识号完成注册,需要DLL标识号,主版本号,次版本 Set ref = References.AddFromGuid("{C5E340E2-C557-4852-AE83-5A0578B6863B}", 1, 0) DLL的标识号是编译生成时就确定了的,这个标识号就是DLL的终生制身份证号,我们可以通过这个唯一标识号来完成DLL自动引用。但此种方法必须具备两个条件,一是DLL已经成功注册,二是我们知道了该DLL的标识号、主版本号、次版本号。 2.2.1获取DLL标识号、主版本号、次版本号方法 Dim ref As Reference '申明引用类对象 '实例化引用类库对象 Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll") Debug.Print ref.GUID '获得DLL唯一标识号 Debug.Print ref.Major '获得主版本号 Debug.Print ref.Minor '获得次版本号

c,,中的模板及函数怎么封装为dll

竭诚为您提供优质文档/双击可除c,,中的模板及函数怎么封装为dll 篇一:封装dll 基于Visualc++6.0的dll编程实现 一、前言 自从微软推出16位的windows操作系统起,此后每种版本的windows操作系统都非常依赖于动态链接库(dll)中的函数和数据,实际上windows操作系统中几乎所有的内容都由dll以一种或另外一种形式代表着,例如显示的字体和图标存储在gdidll中、显示windows桌面和处理用户的输入所需要的代码被存储在一个userdll中、windows编程所需要的大量的api函数也被包含在kerneldll中。 在windows操作系统中使用dll有很多优点,最主要的一点是多个应用程序、甚至是不同语言编写的应用程序可以共享一个dll文件,真正实现了资源"共享",大大缩小了应用程序的执行代码,更加有效的利用了内存;使用dll的另一个优点是dll文件作为一个单独的程序模块,封装性、独立性好,在软件需要升级的时候,开发人员只需要修改相应的dll文件就可以了,而且,当dll中的函数改变后,只要

不是参数的改变,程序代码并不需要重新编译。这在编程时 十分有用,大大提高了软件开发和维护的效率。 既然dll那么重要,所以搞清楚什么是dll、如何在windows操作系统中开发使用dll是程序开发人员不得不解 决的一个问题。本文针对这些问题,通过一个简单的例子,即在一个dll中实现比较最大、最小整数这两个简单函数,全面地解析了在Visualc++编译环境下编程实现dll的过程,文章中所用到的程序代码在windows98系统、Visualc++6.0编译环境下通过。 二、dll的概念 dll是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个dll(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的dll。dll库不同于静态库,在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.lib),Visualc++的编译器在处理程序代码时将从静态库 中恢复这些函数和数据并把他们和应用程序中的其他模块 组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。 在动态库的情况下,有两个文件,一个是引入库(.lib)文件,一个是dll文件,引入库文件包含被dll导出的函数

如何用delphi制作DLL动态库方法

用Delphi制作DLL的方法 一Dll的制作一般步骤 二参数传递 三DLL的初始化和退出清理[如果需要初始化和退出清理] 四全局变量的使用 五调用静态载入 六调用动态载入 七在DLL建立一个TForM 八在DLL中建立一个TMDIChildForM 九示例: 十Delphi制作的Dll与其他语言的混合编程中常遇问题: 十一相关资料 一Dll的制作一般分为以下几步: 1 在一个DLL工程里写一个过程或函数 2 写一个Exports关键字,在其下写过程的名称。不用写参数和调用后缀。 二参数传递 1 参数类型最好与window C++的参数类型一致。不要用DELPHI的数据类型。 2 最好有返回值[即使是一个过程],来报出调用成功或失败,或状态。成功或失败的返回值最好为1[成功]或0[失败].一句话,与windows c++兼容。 3 用stdcall声明后缀。 4 最好大小写敏感。 5 无须用far调用后缀,那只是为了与windows 16位程序兼容。 三DLL的初始化和退出清理[如果需要初始化和退出清理] 1 DLLProc[SysUtils单元的一个Pointer]是DLL的入口。在此你可用你的函数替换了它的入口。但你的函数必须符合以下要求[其实就是一个回调函数]。如下: procedure DllEnterPoint(dwReason: DWORD);far;stdcall; dwReason参数有四种类型: DLL_PROCESS_ATTACH:进程进入时 DLL_PROCESS_DETACH进程退出时 DLL_THREAD_A TTACH 线程进入时 DLL_THREAD_DETACH 线程退出时 在初始化部分写: DLLProc := @DLLEnterPoint; DllEnterPoint(DLL_PROCESS_ATTACH); 2 如Form上有TdcomConnection组件,就Uses Activex,在初始化时写一句CoInitialize (nil); 3 在退出时一定保证DcomConnection.Connected := False,并且数据集已关闭。否则报地址错。 四全局变量的使用 在widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存中是一份,但变量是在各进程的地址空间中,因此你不能借助dll的全局变量来达到两个应用

用VBA封装DLL

VBA封装为DLL及调用 2012-09-04 02:36:00| 分类:VB / VBA / EXCEL | 标签:|举报|字号大中小订阅 使用程序: 1、Microsoft Office Excel 2003 2、Microsoft Visual Basic 6.0 案例:在工作表的C1单元格得出A1单元格+B1单元格的值。 设计的VBA代码: Sub Test() On Error Resume Next Range("C1") = Cells(1, 1) + Cells(1, 2) End Sub 第一部分、使用VB6.0制作DLL文件 一、启动VB6.0,新建一个ActiveX DLL工程: 二、引用:在VB中对Excel的引用

不同版本的EXCEL在“引用”窗口里显示的版本号也不同:EXCEL2000(Microsoft Office 9.0) EXCEL2002(Microsoft Office 10.0),即ExcelXP EXCEL2003(Microsoft Office 11.0) EXCEL2007(Microsoft Office 12.0) EXCEL2010(Microsoft Office 14.0) EXCEL2013(Microsoft Office 15.0) 三、修改ActiveX DLL的工程名称和类模块名称

四、编写代码: 在代码窗口输入代码,过程名称为Test: Sub Test() On Error Resume Next Dim VBt, YB '定义变量VBt Set VBt = GetObject(, "Excel.Application") '使VBt表示为EXCEL对象 Set YB = VBt.ActiveSheet '使YB表示为EXCEL的当前工作表 '注意要在对象前加上YB变量以表示是EXCEL当前工作表的对象 YB. Range("C1") = YB.Cells(1, 1).Value + YB.Cells(1, 2).Value End Sub 五、设置工程属性(为使开发的程序更规范,可以对工程属性加以描述【非必要设置,可以省略】):

VBA封装为DLL及调用

V B A封装为D L L及调用 使用程序: 1、MicrosoftOfficeExcel2003 2、 案例:在工作表的C1单元格得出A1单元格+B1单元格的值。 设计的VBA代码: SubTest() OnErrorResumeNext Range("C1")=Cells(1,1)+Cells(1,2) EndSub 第一部分、使用制作DLL文件 一、启动,新建一个ActiveXDLL工程: 二、引用:在VB中对Excel的引用 不同版本的EXCEL在“引用”窗口里显示的版本号也不同: EXCEL2000() EXCEL2002(),即ExcelXP EXCEL2003() EXCEL2007() EXCEL2010() EXCEL2013() 三、修改ActiveXDLL的工程名称和类模块名称 四、编写代码: 在代码窗口输入代码,过程名称为Test:

SubTest() OnErrorResumeNext DimVBt,YB'定义变量VBt SetVBt=GetObject(,"")'使VBt表示为EXCEL对象 SetYB='使YB表示为EXCEL的当前工作表 '注意要在对象前加上YB变量以表示是EXCEL当前工作表的对象 ("C1")=(1,1).Value+(1,2).Value EndSub 五、设置工程属性(为使开发的程序更规范,可以对工程属性加以描述【非必要设置,可以省略】): 六、保存工程、测试、生成DLL文件: 1、保存工程:保存本工程以作为将来修改代码和升级程序的需要; 2、测试工程:执行快捷工具栏上的“启动”按钮,检查是否存在错误; 3、生成DLL文件:制作DLL文件。 第二部分、调用DLL文件 一、在VBE中调用DLL文件 调用DLL文件,要分两步走:先注册DLL,再引用DLL。 1、注册DLL(使之放在可引用的列表上): 注册DLL也可以使用代码来做,但那样比较复杂,也存在很多问题,建议一般使用手工来注册。 (这里应该先设计好DLL文件放在硬盘的位置,因为后面引用DLL文件的代码也应该是指向这个位置的。)

相关主题
文本预览
相关文档 最新文档