一个与DLL相关的奇怪现象

不得闲 2007-11-08 11:14:12
大家先来看一段代码
我有一个类申明如下:
TFileClass = Class
private
FFileId: integer;
FNodeBookType: Widestring;
FFileName: Widestring;
FComment: Widestring;
FLastModify: TDateTime;
FCreateTime: TDateTime;
procedure SetComment(const Value: Widestring);
procedure SetCreateTime(const Value: TDateTime);
procedure SetFileId(const Value: integer);
procedure SetFileName(const Value: Widestring);
procedure SetLastModify(const Value: TDateTime);
procedure SetNodeBookType(const Value: Widestring);
public
Constructor Create(Name: Widestring);
property NodeBookType: Widestring read FNodeBookType write SetNodeBookType;
property Comment: Widestring read FComment write SetComment;
property FileName: Widestring read FFileName write SetFileName;
property CreateTime: TDateTime read FCreateTime write SetCreateTime;
property FileId: integer read FFileId write SetFileId;
property LastModify: TDateTime read FLastModify write SetLastModify;
end;
然后我在DLL中有一个函数如下:
function FillStringsEx(Strings: integer;SearchText: pchar): integer;
var
sql: string;
List: Tstrings;
FileClass: TFileClass;
begin
List := TStrings(Strings);
List.Clear;
sql := 'select NodeDirIndex,NodeDirText,Comment,CreateTime,LastModify,NodeBookType from T0_NodeDir ';
Query.SQL.Add(sql);
try
Query.Open;
While not Query.Eof do
begin
FileClass := TFileClass.Create(Query.fieldByName('NodeDirText').AsString);
FileClass.FileName := Query.fieldByName('NodeDirText').AsString;
FileClass.Comment := Query.fieldByName('Comment').AsString;
FileClass.CreateTime := Query.fieldByName('CreateTime').AsDateTime;
FileClass.LastModify := Query.fieldByName('LastModify').AsDateTime;
FileClass.NodeBookType := Query.fieldByName('NodeBookType').AsString;
FileClass.FileId := Query.Fields[0].AsInteger;
List.AddObject(FileClass.FileName,FileClass);
Query.Next;
end;
result := 1;
except
result := 0;
end;
Query.Close;
Query.SQL.Clear;
end;

然后我在外面调用这个DLL中的函数
FillStringsEx(Integer(ListBox2.items),pchar(RzEdit2.Text));
然后访问ListBox2的 Items中的对象的时候,返回的FileClass的属性的值居然是相互颠倒的
DLL中的FileClass对象到外面调用的时候,FileName却变成了Comment,而Comment则变成了NodeBookType,而NodeBookType则变成了FileName,请有知道为什么的吗?
...全文
113 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
不得闲 2007-11-25
  • 打赏
  • 举报
回复
算了,揭贴
不得闲 2007-11-12
  • 打赏
  • 举报
回复
恩,改成接口没有试!有时间试一下
king_xing 2007-11-10
  • 打赏
  • 举报
回复
你这样是不安全的!!建议改成接口实现!由DLL创建接口导出
不得闲 2007-11-10
  • 打赏
  • 举报
回复
我用过Stdcall,效果一样,至于 红 枫叶说的 ShareMem单元放在第一位,我用的是FastMm4.76
而信息共享的话,我则是在DLL中创建了一个TFileclass的类,在外面同样也创建了那个类,声明体一样


请大家继续探讨
不得闲 2007-11-09
  • 打赏
  • 举报
回复
Bear_hx
寒萧
等 级:
Bear_hx(寒萧)
----------------
我也改成那样试过,可是还是一样的效果

上次传递一个 Record类型的时候也出现这样情况,我将Pchar换成了Widestring后好了,可是这次,我怎么改都一样的效果
调用方式修改了,也不行!
真是诧异的奇怪


swayi21 2007-11-09
  • 打赏
  • 举报
回复
同意Bear_hx

stdcall
king_xing 2007-11-09
  • 打赏
  • 举报
回复
你是怎么共享TFileClass类信息的?如果是BPL,则编译DLL和Exe时必须把VCL,RTL,VCLX这三个包含进去,如果没有可能会出现奇怪的问题!如果DLL传递了String类型则必须将ShareMem单元放在第一!
Bear_hx 2007-11-09
  • 打赏
  • 举报
回复
你把function FillStringsEx(Strings: integer;SearchText: pchar): integer; 改成
function FillStringsEx(Strings: integer;SearchText: pchar): integer; stdcall试试
莫鸣 2007-11-09
  • 打赏
  • 举报
回复
up

5,388

社区成员

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

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