Adamek Adam napisał(a):
A w Delphi 2006 po stronie EXE wyjątki działają "po ludzku" ? , bo może zanim wywołasz funkcję z DLL sprawdź po stronie EXE ile możesz zajać
Nie rozważałeś Lazarus-a ? Zrobił byś aplikację 64 bit i problem magicznie sam by się rozwiązał
Nie lubię Lazarusa. Tylko Delphi.
Adamek Adam napisał(a):
Próbki kodu OP sugerują że "bug" mógł się łatwo ukryć w tym nieczytelnym gąszczu, a widziałem tylko mały wycinek.
Jak by OP zrobił prosty projekt który można uruchomić na jakimś nowszym Delphi to łatwo by było potwierdzić/zaprzeczyć że to stara wersja.
Adamek, zrobiłem.
dll:
library Project2;
{$R *.res}
var
p:array of pointer;
function doit(n,m:cardinal):int64;stdcall;
var i:integer;
begin for i:=0 to length(p)-1 do if p[i]<>nil then freemem(p[i]);result:=0;p:=nil;
try
setlength(p,n);
for i:=0 to length(p)-1 do begin
getmem(p[i],m);
inc(result,m);
end;
except result:=0; end;
end;
exports doit;
begin
p:=nil;
end.
a tu exec testujący banalny:
unit Unit3;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm3 = class(TForm)
Button1: TButton;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;h:cardinal;
fromdll:function(n,m:cardinal):int64; stdcall;
procedure load;
procedure unload;
implementation
{$R *.dfm}
procedure load;
begin
h:=loadlibrary('project2.dll');
if h<>0 then @fromdll:=getprocaddress(h,pchar('doit'));
end;
procedure unload;
begin
freelibrary(h);
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
showmessage(inttostr(fromdll(100000,100000)));//powinno sie wyswietlić 0 gdyby się program nie wykrzaczył z błędem 203. A tak nie jest niestety.
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
load;
end;
procedure TForm3.FormDestroy(Sender: TObject);
begin
unload;
end;
end.
I sprawdziłem to na Delphi 10.3. efekt ten sam jak na moim starym Turbo Delphi. Tym bardziej ponawiam prośbę do furous o instrukcję do korzystania z GlobalMemoryStatusEx bo nie umiem.