为什么动态数组的一个问题,求求各位帮帮忙,小弟在这问了几天了,都没有得到解决.(在线等待)(22分)

  • 主题发起人 主题发起人 taibu
  • 开始时间 开始时间
T

taibu

Unregistered / Unconfirmed
GUEST, unregistred user!
Procedure ReadDataFile(aApp:TApplication;DllScr:TScreen;aFileName:Pchar;
DirSize:DS);stdcall;
var
PAK: TcymPak;
i,n:integer;
TMPStream:TMemoryStream;
begin
CoInitialize(Nil);
Application:=aApp;
aFileName:='f:/1234.fax';
try
PAK := TcymPak.Create(Nil, aFileName);
n:=Pak.Directory.Count;
DirSize:=Nil;
SetLength(DirSize,n);
for i:=0 to n-1 do
begin
TMPStream:=TMemoryStream.Create;
PAK.ItemToStream(i,TMPStream);
Dirsize:=TMPStream.Size;
TMPStream.Free;
end;
finally
//释放TmpPak
if Assigned(Pak) then
begin
PAK.Free; //如果一执行完这行,则DirSize的值全为空了.这是为什么?
PAK := nil;
end;
end;
end;
 
各位帮帮忙啊,我要如何才能把获取的Dirsize值返回到主程序中?
 
跟那行没关系吧。
你得DirSize应该是 var 的变量才行。 否则永远不能输出值吧。
 
to duhai_lee,
你的意思是改成
Procedure ReadDataFile(aApp:TApplication;DllScr:TScreen;aFileName:Pchar;
var DirSize:DS);stdcall;
是这样吗?
 
如果添加var也不行,只要释放DLL就连动态数组也释放了.
 
释放dll, 会把dirsize的空间也释放掉, 你可以在宿主程序中声明变量,把它的值,地址复制了.
 
to duhai_lee
你的意思是不是再定义一个变量如
var
abc:DS;
.....
在释放DLL之前进行
abc:=DirSize
是这样吗?如果是这样的话,我试过,也不行,只要一释放DLL,abc也跟着释放.还请各位继续帮忙想办法.
 
用文件映射行不行?
用mapviewoffile共享内存块
 
你得ds是个什么类型? 如果是record, 最好用指针的. 然后new空间, 赋值就行.
如果是类, 就create, 然后赋值. 我这样想.
 
type
DS=Array of integer;
这就是我的DS类型,请问要怎么做呢?
 
还有,我对你所说的指针及new空间不太熟悉,能否麻烦你说清楚点?最好写完整代码?非常感谢你的帮忙!
 
不要再dll里面申请空间。建议你先把Pak.Directory.Count传出去,在外面setlength了再执行。
 
后退
顶部