你好,请教一个问题,delphi如何调用DLL中的一个带动态数组参数的方法?
我定义的结构体:TFieldInfo=recordFileName:PChar;DisplayText:PChar;NotNull:Boolean;end;TFieldI...
我定义的结构体:
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 展开
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 展开
3个回答
展开全部
应该是DLL和EXE都引用ShareMem就可以了
另外在你空间回答了
另外在你空间回答了
追问
我传的参数没有敢用string,还需要引用ShareMem单元吗?调用DLL中的带数组参数的方法是不是必须用数组指针?
我空间里的回答我觉得解释的通。之前好像在网上下载过你的某一个小程序,忘了名字了。
追答
如果DLL参数是动态数组可能是需要ShareMem,我没这样用过。只是印象中这样。
另外关于字符串你可以看《Delphi源代码分析》这本书,里面提到的string的格式。
是: 引用计数 + 串长 + 字符串内容
而字符串变量本身是一个指针(4字节),是字符串内容的首地址 (引用计数和串长可以通过此地址-4、 -8得到)
来自:求助得到的回答
展开全部
个人一点建议,你觉得有理就试试,否则就当我没说:
1、凡是写dll,尽量不要把Delphi的string和动态数组作为参数传递,因为这些玩意都是Delphi的独门类型(含有计数引用、长度等额外的狗屎东西),Windows认识你Delphi老大贵姓?Windows API哪个含有动态类型的参数?全用的指针!
2、动态数组变量本身就是个指针,直接使用它本来面目进行传递。这样改函数:
function ImportData(FieldInfosPtr: Pointer): Boolean;
var
AFieldInfo: TFieldInfos;
begin
AFieldInfo := FieldInfosPtr;
其它部分不变...
end;
1、凡是写dll,尽量不要把Delphi的string和动态数组作为参数传递,因为这些玩意都是Delphi的独门类型(含有计数引用、长度等额外的狗屎东西),Windows认识你Delphi老大贵姓?Windows API哪个含有动态类型的参数?全用的指针!
2、动态数组变量本身就是个指针,直接使用它本来面目进行传递。这样改函数:
function ImportData(FieldInfosPtr: Pointer): Boolean;
var
AFieldInfo: TFieldInfos;
begin
AFieldInfo := FieldInfosPtr;
其它部分不变...
end;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
var
fieldInfo:TFieldInfo;
调用:
ImportData( @fieldInfo);
fieldInfo:TFieldInfo;
调用:
ImportData( @fieldInfo);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询