Avatar billede bhahn Nybegynder
10. juni 2002 - 16:11 Der er 5 kommentarer

Problemer med dll

Jeg har et meget alvorligt problem, som jeg håber nogen kan hjælpe mig med.
Mit DLL efterlader hukommelse og giver også acces violation indimellem.


Delphi version: 3.0
Tester hukommelsen med: Memory Sleuth ver. 1.59

Sleuth viser at der Efterlades 92byte, 5pointers, 1pen, 1brushe, 1font.

Sleuth giver ingen liniehenvisninger på den efterladte hukommelse (jeg har slået alt til under options-compiler-debugning og options-linker-include TD32 debuginfo)

Sleuth giver dette under Debug Output:
  Client caused an access violation at 23456Ch
    while attempting to write to 30F78h.
    Flags:0h.
Jeg ved ikke hvad jeg kan bruge dette til, jeg har prøvet at bruge Search error.

Jeg er egentlig igang med et større projekt, men har fjernet alt andet end det, som giver problemerne.

Følgende filer er bruget:
ExeProject.dpr, ExeUnit.pas, DllProject.dpr, DllUnit.pas.

ExeProject.dpr:

program ExeProject;
uses
  {ShareMem,}
  Forms,
  ExeUnit in 'ExeUnit.pas' {ExeForm};
{$R *.RES}
begin
  Application.Initialize;
  Application.CreateForm(TExeForm, ExeForm);
  Application.Run;
end.


ExeUnit.pas:

unit ExeUnit;
interface
uses
  {ShareMem, }Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TExeForm = class(TForm)
    DllCallBtn: TButton;
    procedure DllCallBtnClick(Sender: TObject);
  private
  public
  end;
var
  ExeForm: TExeForm;
implementation
{$R *.DFM}
Function SayHello(Var Num1:LongInt):LongInt; stdcall; external 'DllProject.dll';
procedure TExeForm.DllCallBtnClick(Sender: TObject);
Var
  LI1:LongInt;
  LI2:LongInt;
begin
  LI1 := -7;
  LI2 := SayHello(LI1);
end;
end.


DllProject.dpr:

library DllProject;
uses
  {ShareMem,}
  SysUtils,
  Classes,
  DllUnit in 'DllUnit.pas' {DllForm};
exports
  SayHello;
{$R *.RES}
begin
end.


DllUnit.pas:

unit DllUnit;
interface
uses
  {ShareMem, }Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TDllForm = class(TForm)
    CloseBtn: TButton;
    HelloLbl: TLabel;
    procedure CloseBtnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  DllForm: TDllForm;
Function SayHello(Var HelloNum:LongInt): LongInt; export; stdcall;
implementation
{$R *.DFM}
Function SayHello(Var HelloNum:LongInt): LongInt;
Begin
  DllForm := tDllForm.Create(Application);
  Try
    HelloNum := 54321;
    DllForm.ShowModal;
    Result := 123;
  Finally
    DllForm.Release;
    DllForm := Nil;
  End;
End;
procedure TDllForm.CloseBtnClick(Sender: TObject);
begin
  Close;
end;
end.

Avatar billede dkn Nybegynder
10. juni 2002 - 16:59 #1
uses
  {ShareMem, }

skal være

uden {}

ved ikke om det løser noget men hvis du skal skrive mellem program og dll skal sharemem være den første
Avatar billede bhahn Nybegynder
10. juni 2002 - 17:23 #2
ShareMem er kun nødvendig hvis man bruger String i dll-kald. Desuden har jeg forlængst prøvet at tilføje ShareMem, men det gav ingen forskel.
Avatar billede martinlind Nybegynder
10. juni 2002 - 17:53 #3
Du kan prøve at "putte" den her code ind, så for du den line og unit din exception er sket i

http://www.undu.com/Articles/010729d.html

/Martin
Avatar billede doc404 Novice
10. juni 2002 - 23:47 #4
Memory leaken i D3 er et kendt problem som du kan læse mere om her:

http://djernaes.dk/martin/4kbug.html

Udskift din release med en Free og det burde virke. Du kan finde lange forklaringer på google i nyhedsgrupperne
Avatar billede bhahn Nybegynder
24. juni 2002 - 08:39 #5
Det er egentlig kommentaren fra doc404, som har hjulpet mig mest, idet jeg nu har opdateret til Delphi6, som løste problemet.

Det må dog siges at udskiftning af release med en Free ikke løste problemet. Det har jeg også forlængst prøvet. Desuden står der i hjælpen at man for forms skal bruge release.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester