☆☆☆☆☆Delphi制作标准Dll 函数如何接受数组?

gaoqi5037 2002-09-14 11:10:12
Delphi制作标准Dll 函数如何接受数组?

本人是Delphi菜鸟..麻烦各位大虾给出详细的代码示例..另有重谢

谢谢大家
...全文
59 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssq_td 2002-09-14
  • 打赏
  • 举报
回复

将dll的参数类型定义为var..(忘了怎么写)
要传进去的数组也转成一样的类型!就可以了!!1
alexxing 2002-09-14
  • 打赏
  • 举报
回复
Delphi 的动态数组肯定是不能通用的,必须用“低级”的数据结构,可以直接用指针(不太好),或者用下面的办法


library TestDll;

{$R-} // 临时关闭越界检查

type TElement = ...; // 你的数组元素类型
type TArray = array[0..1] of TElement;

function CopyArray(var Dst: TArray; const Src: TArray; Len: Integer): Integer; stdcall;
var
I: Integer;
begin
for I := 0 to Len do
begin
Dst[I] := Src[I]
end;
Result := Len;
end;
{$R+}

exports

CopyArray;

begin
end.


在 C/C++ 使用上面的 DLL:

typedef ... TElement;
typedef TElement TArray[1];

__declspec( dllimport ) int __stdcall CopyArray(TArray Dst, const TArray Src, int Len);


如果用显式加载,就是:

typedef int (__stdcall * CopyArrayProc) (TArray Dst, const TArray Src, int Len);

hModule = LoadLibrary("TestDll.dll");
CopyArrayProc CopyArray = (CopyArrayProc) GetProcAddress(hModule, "CopyArray");
int Result = CopyArray(Dst, Src, Len);
...
alexxing 2002-09-14
  • 打赏
  • 举报
回复
Delphi 的动态数组肯定是不能通用的,必须用“低级”的数据结构,可以直接用指针(不太好),或者用下面的办法


library TestDll;

{$R-} // 临时关闭越界检查

type TElement = ...; // 你的数组元素类型
type TArray = array[0..1] of TElement;

function CopyArray(var Dst: TArray; const Src: TArray; Len: Integer): Integer; stdcall;
var
I: Integer;
begin
for I := 0 to Len do
begin
Dst[I] := Src[I]
end
end;
{$R+}

exports

CopyArray;

begin
end.


在 C/C++ 使用上面的 DLL(具体函数原型可能跟编译器有关):

typedef ... TElement;
typedef TElement TArray[1];

__declspec( dllimport ) int __stdcall CopyArray(TArray Dst, const TArray Src, int Len);
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_ATTACH 线程进入时 DLL_THREAD_DETACH 线程退出时 在初始化部分写: DLLProc := @DLLEnterPoint; DllEnterPoint(DLL_PROCESS_ATTACH); 2 如Form上有TdcomConnection组件,就Uses Activex,在初始化时写一句CoInitialize (nil); 3 在退出时一定保证DcomConnection.Connected := False,并且数据集已关闭。否则报地址错。 四全局变量的使用 在widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存中是一份, 但变量是在各进程的地址空间中,因此你不能借助dll的全局变量来达到两个应用程序间的数据 传递,除非你用内存映像文件。 五、其他:调用方式按照标准的Windows调用方式. 六、关于参数传递 •Delphi程序之间调用DLL,如果要用String类型的话,要在引用的单元加上ShareMem 单元。 •如果Delphi写的DLL供其他开发工具使用的话,不要使用String类型,用PAnsiChar类型。 尽量使用标准DLL接口。指的是传递的参数类型及函数返回类型不能是Delphi特有的, 比如string(AnsiString),以及动态数组和含有这些类型成员的复合类型(如记录),也不 能是包含有这些类型成员数据成员的对象类型,以避免可能的错误。如果使用了string类型或 动态数组类型,且调用方不是Delphi程序,则基本上会报错。如果调用方是Delphi但调用方或 被调用方没有在工程文件的第一包含单元不是ShareMem,也可能会出错。 七、关于回调Funciton 你可以把Callback函数看作是一种特殊的消息响应函数,一般来说我们不会自己调用这种函数, 而是有某些系统函数调用,而且不需要向后传递消息。 只要象C/C++这样支持函数指针的语言都 有回调函数的概念,它实际上是向被调用函数传一个你的函数地址,然后被调用函数向通过你传 入的函数地址来调用你的函数 。 以上是结构化回调,到高级语言Object Pascal、C++中回调函数并没有退出,反而得到延伸与 扩展,在面向对像中的回调,其实是指面向对像中类对像的事件,事件就是原始的回调函数。面 向对像, 将回调函数定义成事件过程,在程序引用对像时,若指定了对像的过程事件后,那么在 要进行事件触发的地方检查事件过程是否分配,如果分中的就执行事,也就是执行了回调函数
目录: 第1章 Delphi 7程序设计入门 1.1 理论知识 1.1.1 算法与程序设计 1.1.2 面向对象程序设计基础 1.1.3 Delphi 7概述 1.1.4 Delphi 7的集成开发环境 1.1.5 利用Delphi开发应用程序的方法步骤 1.1.6 Delphi 7程序的组成 1.2 典型实例 1.3 上机练习 课后考场 第2章 基本数据类型与表达式 2.1 理论知识 2.1.1 基本数据类型 2.1.2 Delphi 7中的标识符与保留字 2.1.3 Delphi 7中的常量与变量 2.1.4 Delphi 7中的运算符与表达式 2.1.5 Delphi 7的语句书写规则与赋值语句 2.1.6 Delphi 7的常用函数与过程 2.2 典型实例 2.3 上机练习 课后考场 第3章 基本程序设计语句 3.1 理论知识 3.1.1 基本的顺序结构语句及其应用 3.1.2 选择结构语句及其基本应用 3.1.3 循环结构语句及其基本应用 3.2 典型实例 3.2.1 典型实例一 3.2.2 典型实例二 3.2.3 典型实例三 3.2.4 典型实例四 3.2.5 典型实例五 3.3 上机练习 3.3.1 上机练习一 3.3.2 上机练习二 课后考场 第4章 数组程序设计 4.1 理论知识 4.1.1 数组的概念 4.1.2 一维静态数组的定义与使用 4.1.3 二维数组及多维数组的定义与使用 4.1.4 动态数组的定义与使用 4.2 典型实例 4.2.1 典型实例一 4.2.2 典型实例二 4.3 上机练习 4.3.1 上机练习一 4.3.2 上机练习二 课后考场 第5章 过程与函数 5.1 理论知识 5.1.1 过程与函数的概念 5.1.2 过程的定义与调用 5.1.3 函数的定义与调用 5.1.4 参数的传递 5.1.5 子程序的嵌套与递归 5.2 典型实例 5.2.1 典型实例一 5.2.2 典型实例二 5.3 上机练习 5.3.1 上机练习一 5.3.2 上机练习二 课后考场 第6章 用户自定义类型 6.1 理论知识 6.1.1 枚举类型的定义与使用 6.1.2 子界类型的定义与使用 6.1.3 集合类型的定义与使用 6.1.4 记录类型的定义与使用 6.2 典型实例 6.2.1 典型实例一 …… 第7章 常用组件的使用 第8章 Delphi 7的文件系统 第9章 应用程序界面设计技术 第10章 DLL应用编程 第11章 组件开发技术 第12章 图形图像编程 第13章 多媒体应用程序开发 第14章 数据库应用开发 附录A Delphi中的虚拟键代码及对应的键
本书是一本Delphi综合开发参考手册,书中几乎囊括了使用Delphi进行实用程序开发的全部知识,同时在讲解中结合了大量实用而又有代表性的示例和典型应用。全书共分36章,包括认识DelphiDelphi语言基础,Delphi控制语句,数组与算法,过程与函数,面向对象的程序设计,用户界面设计,菜单、工具栏和状态栏设计,对话框在程序中的应用,组件的使用,自制VCL组件,鼠标、键盘相关技术的应用,图形图像处理技术,多媒体技术,文件操作技术,系统控制技术,ADO数据库开发技术,常用数据组件,添加、删除和修改数据,浏览与查询数据,图表组件的设计,多层数据库程序,报表与打印程序设计,数据库安全技术,网络编程,Internet编程,数据通信,Windows API函数的应用,DLL动态链接库的使用,多线程的应用,消息处理技术,注册表的应用,程序优化,程序调试,自定义帮助,程序打包及安装等内容。书中各部分介绍的技术既相互独立又相互联系,可以逐步引导读者深入学习并掌握Delphi的编程知识、方法和编程技巧。 本书附有配套光盘。光盘提供了书中示例和典型应用实例的全部源代码,所有源代码都经过精心调试,在Windows 2000下测试通过,保证能够正常运行。 第1篇 Delphi基础篇  第1章 认识Delphi  第2章 Delphi语言基础   第3章 Delphi控制语句  第4章 数组与算法  第5章 过程与函数  第2篇 用户界面设计篇  第6章 面向对象的程序设计   第7章 用户界面设计  第8章 菜单、工具栏和状态栏设计  第9章 对话框在程序中的应用   第10章 组件的使用   第11章 自制VCL组件  第12章 鼠标、键盘相关技术的应用 第3篇 文件、图形与多媒体篇

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧