18. maj 2012 - 16:44 Der er 2 kommentarer og
1 løsning

DLL + forms = problemer ???

HEJ,

Jeg har læst et eller andet sted at Windows bruger en masse DLL'ere (med eller uden forms).

Skaber jeg en DLL uden forms kører den som en drøm. Skaber jeg en DLL med form kan jeg - afhængig af form'ens komplexitet - opleve at den giver mig RUN-time error 213.

Er det en meget simpel form (f. eks en form med en LABEL på , som kan indeholde en variabel text), oplver jeg sjældent problemer. Men hvis jeg inkludere en Tedit og forventer at input-stringen fra denne TEdit skal returneres - opstår problemer (syntaks og kal/retur er korrekt iflg bogen). Jeg bruger den foreslåede MEM-MANAGER (både DLL'en og kaldende MAIN prgrm, og nogen gange går det godt andre gange får jeg E-213.

1: Hvad er error 213 (min doku om dette er mangelfuld) ?

Hvis jeg inkluderer Databaser  (åbnes umiddelbart efter DLL kaldet AF DLL'ens form og lukkes umiddelbart før FORM-lukning) og andre mere komplekse komponenter går det osse godt (nogen gange), men når jeg lukker programmet (Application.Termnate; eller Close; ) vælter E-213 i en lind strøm op på skærmen (antal er = med antal gange jeg har kaldt DLL'en ). Og det HVER ENESTE GANG...

Det fatter jeg bare ikke en lyd af  - HJÆLP ?

Kristian
Avatar billede friiiiis Novice
22. maj 2012 - 09:48 #1
1) Hvordan kalder du din DLL? Skriv venligst kildekoden? Har du husket StdCall?

2) Application.terminate eller close skal helst ikke bruges - benyt hellere self.close. og husk at brug Action := caFree ved Form.Onclose

3) jeg bør nævne at nedenstående er direkte en kopi af Borrisholt kildekode og altså ikke noget jeg selv har fundet ud af...

Jeg kalder en DLL på følgende måde - det der løste problemet for mig var "DLL_PROCESS_DETACH"


//==============================================

library BlandeAnlaegDLL;


uses
  SysUtils,
  Classes,
  Forms,
  Windows,
  activeX,
  BlandeAnlgsData_Unit in 'BlandeAnlgsData_Unit.pas' {Form10},
  DatoTimePicker in 'DatoTimePicker.pas' {Form2},
  Unit2 in 'Unit2.pas' {Form3};

var
  DllApplication : TApplication;
{$R *.RES}

function BlandeAnlaegDLLForm(ParentApplication:TApplication;ParentForm:TForm;var FileNameStringSaveAs :shortstring;var TestCompiling:boolean): integer; stdcall;
begin
  Application := ParentApplication;
  coinitialize(nil);
  Form10 := TForm10.Create(ParentForm);
  form10.FileNameStringSaveAs2 := FileNameStringSaveAs;
  SetCurrentDir(FileNameStringSaveAs);
  form10.TestCompiling := TestCompiling;
  Form10.Showmodal;
  Result := 1;
  //Result := Form1.Heltal;
  Form10.free;
end;


procedure DLLUnloadProc(Reason: Integer); register;
begin
  if Reason = DLL_PROCESS_DETACH then
    Application := DllApplication;
end;


exports
  BlandeAnlaegDLLForm;

begin
DllApplication := Application;
DLLProc := @DLLUnloadProc;
end.
23. maj 2012 - 00:59 #2
HEJ

Tak for svaret.

Det sjove er: En nat jeg ikke kunne sove stod jeg op og startede PC'en. efter et par Solitaire (7-kabalen) fik jeg lyst til at arbejde lidt med Delphi og DLL-problemet. Oprettede en DLL (FILE - NEW- Other -> OSV), lagde en ny form ind, lagde en enkelt funktion (showform)
..
Form1 := TForm1.create(nil);
(*  her kom koden da det virkede *)
Form1.showModal;
Form1.Free;
..

Kompilerede og kørte. Og det virkede uden nogen form for problemer. (Altså INGEn 213, 217 eller noget som helst...)

(Så fik jeg blod på tanden) ... 

da jeg endelig lagde mig igen (06:30) havde jeg en MAIN form med 4 buttons (som hver kaldte sin DLL med en database åbning i hver DLL (samme base i alle 4 DLL'er (for at teste ));

Åbnede og lukkede de 4 DLL'er uafhængigt af hinanden, testede oppe og nede --> Men uanset hvad jeg end gjorde så virkede det --
INGEN FEJL - ingen 213' ingen 217, ingen fejl overhovedet - og det bedste -  heller ikke når jeg lukkede programmet OG delphi...

Så egentlig har jeg løst det selv, men din kode / Borrisholts indeholder noget jeg kan bruge i anden sammenhæng, så jeg vi synes at den kode er 30 point værd - ikke ??

IF Answer = 'JA' then
  Drop_et_svar('ja');

Kristian

Kr

PS: I den nye kode bruger jeg ikke Appl--.Terminate;
kun Close, men måske skal jeg anvende


procedure DLLUnloadProc(Reason: Integer); register;
begin
  if Reason = DLL_PROCESS_DETACH then
    Application := DllApplication;
end;

Vil prøve det senere (i nat kan jeg nemlig godt sove

ZZZZZZZZ  (hehe)  )

KR
Avatar billede friiiiis Novice
26. maj 2012 - 20:04 #3
svar ;-)
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