你好,请教一个问题,delphi如何调用DLL中的一个带动态数组参数的方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你好,请教一个问题,delphi如何调用DLL中的一个带动态数组参数的方法?相关的知识,希望对你有一定的参考价值。

我定义的结构体:
TFieldInfo = record
FileName: PChar;
DisplayText: PChar;
NotNull: Boolean;
end;

TFieldInfos = array of TFieldInfo;

DLL(自己用delphi写的)中的函数需要传递一个动态数组:
函数声明如:
function ImportData(AFieldInfo: array of TFieldInfo): Boolean;
或:function ImportData(AFieldInfo: TFieldInfos): Boolean;

应该如何调用?如果该方法不是在DLL中封装,调用没有问题,但如果封装到DLL中,调用报地址错误。

另外,还有一个疑问,见链接:http://user.qzone.qq.com/303163222/infocenter#!app=2&via=QZ.HashRefresh&pos=1339581464

应该是DLL和EXE都引用ShareMem就可以了

另外在你空间回答了追问

我传的参数没有敢用string,还需要引用ShareMem单元吗?调用DLL中的带数组参数的方法是不是必须用数组指针?
我空间里的回答我觉得解释的通。之前好像在网上下载过你的某一个小程序,忘了名字了。

追答

如果DLL参数是动态数组可能是需要ShareMem,我没这样用过。只是印象中这样。

另外关于字符串你可以看《Delphi源代码分析》这本书,里面提到的string的格式。
是: 引用计数 + 串长 + 字符串内容
而字符串变量本身是一个指针(4字节),是字符串内容的首地址 (引用计数和串长可以通过此地址-4、 -8得到)

来自:求助得到的回答
参考技术A 个人一点建议,你觉得有理就试试,否则就当我没说:
1、凡是写dll,尽量不要把Delphi的string和动态数组作为参数传递,因为这些玩意都是Delphi的独门类型(含有计数引用、长度等额外的狗屎东西),Windows认识你Delphi老大贵姓?Windows API哪个含有动态类型的参数?全用的指针!
2、动态数组变量本身就是个指针,直接使用它本来面目进行传递。这样改函数:
function ImportData(FieldInfosPtr: Pointer): Boolean;
var
AFieldInfo: TFieldInfos;
begin
AFieldInfo := FieldInfosPtr;
其它部分不变...
end;
参考技术B var
fieldInfo:TFieldInfo;
调用:
ImportData( @fieldInfo);

你好,请教个问题,就是delphi中DBGridEh的统计行数据如何实现的

参考技术A 这事可以在设计期指定,也可以在运行期由代码来指定.运行期指定就把DBGridEh搞埃了,不灵活,说起来比较麻烦,你还不易搞懂.就说用代码吧:
DBGrideh1.FooterRowCount:=1;//新添加一行脚注
DBGrideh1.SumList.Active:=true;
for i:=0 to DBGrideh1.Columns.Count-1 do//一共有多少列
begin
DBGrideh1.Columns[i].Footer.FieldName:=DBGrideh1.Columns[i].Title.Caption;
if i=0 then//指定第一列显示标题名
begin
DBGrideh1.Columns[i].Footer.ValueType:=fvtStaticText;
DBGrideh1.Columns[i].Footer.Value:='项目合计';
DBGrideh1.Columns[i].Footer.Alignment:=tacenter;
end
else
begin //其它列都显示数据,求和,当然也可是计数,求均值等等
DBGrideh1.Columns[i].Footer.ValueType:=fvtSum;
end;
因此,完全套用本代码时要注意,除第一列是显示标题文本外,其它列都应该是数字,否则会出错.
当然你把.ValueType:=fvtSum中fvtSum改成其它的也可.
if i<2 then
DBGrideh1.Columns[i].Width :=70
else
DBGrideh1.Columns[i].Width :=50;
end;

以上是关于你好,请教一个问题,delphi如何调用DLL中的一个带动态数组参数的方法?的主要内容,如果未能解决你的问题,请参考以下文章

我是Delphi新手,现请教一个调用DLL的问题.

请教python调用dll动态库的传参问题

请教python调用dll动态库的传参问题

C# 中如何调用DLL文件?

请教:如何将写好的类封装成dll文件

C#使用C++ dll问题