平台:Windows 7 + Delphi 7
现象:主程序创建N个线程(>50),每个线程都会调用同一个DLL,线程内部为循环运行(除非Teiminate),大约1,2小时后开始报错。
主程序相关代码(仅示例代码,主程序及DLL均第一个单元引用FASTMM):TCreateOrder = function(DeviceID:PChar): PChar; stdcall;
procedure
var Func: TCreateOrder;
t_dll:Cardinal;
begin @Func := GetProcAddress(t_dll, 'CreateOrder'); //t_dll为exe建立时Load,,尝试过每次Load,问题依旧
cmdSend := Func(PChar(tcomid));
//这里即为出错位置。Access violation at address 0C708563 in module 'ys.dll'. Write of address 00000000 In TThreadCJ
end;
DLL代码:function CreateOrder(DeviceID:PChar): PChar;stdcall;
var
order:array[0..6] of integer;
i:integer;
orderstring:string;
CommID:integer;
begin
try
CommID := strtoint(DeviceID);
order[0]:= CommID mod 200;
order[1]:= commid div 200;
order[2]:= 3;
order[3]:= 0;
order[4]:= 0;
order[5]:= 0;
order[6]:= 0;
orderstring := '';
for i:= 0 to 6 do
begin
orderstring := orderstring + inttohex(order[i],2) + ' ';
end;
Result := PChar(orderstring);
except on e:exception do
begin
//
end;
end;
end;exports
CreateOrder;
现象:主程序创建N个线程(>50),每个线程都会调用同一个DLL,线程内部为循环运行(除非Teiminate),大约1,2小时后开始报错。
主程序相关代码(仅示例代码,主程序及DLL均第一个单元引用FASTMM):TCreateOrder = function(DeviceID:PChar): PChar; stdcall;
procedure
var Func: TCreateOrder;
t_dll:Cardinal;
begin @Func := GetProcAddress(t_dll, 'CreateOrder'); //t_dll为exe建立时Load,,尝试过每次Load,问题依旧
cmdSend := Func(PChar(tcomid));
//这里即为出错位置。Access violation at address 0C708563 in module 'ys.dll'. Write of address 00000000 In TThreadCJ
end;
DLL代码:function CreateOrder(DeviceID:PChar): PChar;stdcall;
var
order:array[0..6] of integer;
i:integer;
orderstring:string;
CommID:integer;
begin
try
CommID := strtoint(DeviceID);
order[0]:= CommID mod 200;
order[1]:= commid div 200;
order[2]:= 3;
order[3]:= 0;
order[4]:= 0;
order[5]:= 0;
order[6]:= 0;
orderstring := '';
for i:= 0 to 6 do
begin
orderstring := orderstring + inttohex(order[i],2) + ' ';
end;
Result := PChar(orderstring);
except on e:exception do
begin
//
end;
end;
end;exports
CreateOrder;
var
order:array[0..6] of integer;
i:integer;
orderstring:PChar;//orderstring:string;
CommID:integer;
begin
try
CommID := strtoint(DeviceID);
order[0]:= CommID mod 200;
order[1]:= commid div 200;
order[2]:= 3;
order[3]:= 0;
order[4]:= 0;
order[5]:= 0;
order[6]:= 0;
{orderstring := '';
for i:= 0 to 6 do
begin
orderstring := orderstring + inttohex(order[i],2) + ' ';
end;
Result := PChar(orderstring);}
GetMem(orderstring, 7*2+1);
try
for i:= 0 to 6 do
StrCopy(orderstring, PChar(inttohex(order[i], 2)));
Result := orderstring;
finally
FreeMem(orderstring);
end;
except on e:exception do
begin
//
end;
end;
end;
var
order:array[0..6] of integer;
i:integer;
orderstring:PChar;//orderstring:string;
CommID:integer;
begin
try
CommID := strtoint(DeviceID);
order[0]:= CommID mod 200;
order[1]:= commid div 200;
order[2]:= 3;
order[3]:= 0;
order[4]:= 0;
order[5]:= 0;
order[6]:= 0;
{orderstring := '';
for i:= 0 to 6 do
begin
orderstring := orderstring + inttohex(order[i],2) + ' ';
end;
Result := PChar(orderstring);}
GetMem(orderstring, 7*2+1);
try
for i:= 0 to 6 do
StrCopy(orderstring, PChar(inttohex(order[i], 2)));
Result := orderstring;
finally
FreeMem(orderstring);
end;
except on e:exception do
begin
//
end;
end;
end;