| Autor |
Beitrag |
kiwicht
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mo 20.01.03 12:02
Hallo zusamm´n...
folgendes:
hab ein riesengroßes Progg geschrieben, der Source-Code in jenem zur DLL-Einbindung lautet wie folgt
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| interface
uses // diverse units, die ich fürs hauptprogg brauche
type TForm1 = class(TForm) // ... ganz ganz viele typen halt ... u.a.: procedure InitDaten; stdcall; //<--- hier Fehlermeldung, siehe unten
implementation
uses // .. n paar formulare die ich brauche
const dlltoload = 'ex_init.dll';
procedure InitDaten; external dlltoload;
// ... Rest vom Programm ....
InitDaten;
// ... noch mehr irrelevanter Code |
soviel zum Hauptprogramm, jetzt die DLL.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| library ex_init;
uses SysUtils, Classes, main in 'main.pas' // mein Hauptprogramm
procedure InitDaten; begin with Form1 do begin // hier weise ich ein paar DBEdit-Felder die entsprechenden Felder // einer SQL-DB zu end; end;
Exports InitDaten index 1;
begin end. |
fertig. so siehts aus. doch wenn ich jetzt das Hauptprogramm ausführe, springt er oben zu der Procedure und sagt mir :
Unsatisfied forward or external declaration TForm1.InitDaten
Wenn ich die DLL in Delphi ausführe, erhalte ich ne "simple" Acces Violation at adress .... in module ex_init.dll!
Was mach ich falsch? Ich hab mir nu schon 2 Tut´s runtergeladen und in 3 Foren nach ähnlichen Fehlern gesucht, aber geholfen hats noch nicht....
 bin also für jeden Hinweis zur Ergreifung des Übeltäters dankbar...
mfg
kiwicht
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 20.01.03 12:08
Geh mal auf meine Seite und lies dir das DLL Tutorial von Assarbad durch. Das sollte so einiges klären.
www.luckie-online.de...als/dll_tutorial.pdf Achtung PDF-Datei!
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mo 20.01.03 12:35
das hab ich schon.... aufgrund diesem Tut und den Beispiel-Dateien hab ich ja mein Programm geschrieben... und es geeeeht nicht...
(und ich muss dazusagen, das das tut fachlich wohl einzigartig umfangreich ist, aber für einen newby wie mich total überladen daherkommt. da werden *.pas-Dateien ausgelagert ohne Ende, es werden gleichzeitig auf drei oder vier verschiedene Arten die funktionen mit über von gleich zig variablen importiert... für mich alles ziemlich verwirrend... aber ich will mich ja nicht beschweren, dafür isses ja umsonst...  )
|
|
Sven
      
Beiträge: 314
D6 Ent, K3 Pro (patched)
|
Verfasst: Mo 20.01.03 14:16
Ich bin mir nicht ganz sicher. Kann es vielleicht daran liegen, daß Du in Deiner Dll ein Formular aus Deinem Hauptprogramm einbindest/aufrufst?
_________________ MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mo 20.01.03 14:20
nun ja, schon.
wie gesagt, ich weise in der DLL den DBEdit-Felder aus meinem Hauptformular die Datenfelder einer DB zu.
In der DLL steht aber dann with Form1 do begin, und er sagt ja auch nix, soll heissen die DLL kann ich ja erstmal bedenkenlos ausführen...
mittlerweile versuch ich ja jetzt alles dynamisch einzubinden, komm da aber auch nicht weiter.... und hab jetzt schon das dritte tut durchgearbeitet...
kennt ihr das gefühl, wenn man sich von delphi n bissel verscheissert fühlt, weil egal was man macht, es ist falsch? 
|
|
Sven
      
Beiträge: 314
D6 Ent, K3 Pro (patched)
|
Verfasst: Mo 20.01.03 15:02
Du schreibst folgendes:
| Zitat: | | Wenn ich die DLL in Delphi ausführe, erhalte ich ne "simple" Acces Violation at adress .... in module ex_init.dll! |
des weiteren hast Du in der Dll folgenden Code:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| uses SysUtils, Classes, main in 'main.pas' // mein Hauptprogramm
procedure InitDaten; begin with Form1 do begin // hier weise ich ein paar DBEdit-Felder die entsprechenden Felder // einer SQL-DB zu end; end; |
Ich meine: Woher kennt InitDaten was zur Laufzeit Form1 ist? Deine Form1 aus der DLL hat zur Laufzeit mit Deiner Form1 aus dem Hauptprogramm überhaupt nichts zu tun. Ich sehe das so, das Du entweder die ganze Form1 einschließlich Bearbeitung usw. in die Dll verlagerst; mit aufrufen und schließen, oder Du füllst die DBEdit-Felder in Deinem Hauptprogramm.
_________________ MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mo 20.01.03 15:30
aber ich hab doch unter USES
auch die main.pas angegeben... und bezüglich der form1 sagt er auch nix mehr, das scheint also erstmal zu funzen.
welche frage mich aber im moment viel mehr beschäftigt:
bringen mir denn dll´s in meinem fall überhaupt was? weil ja eigentlich jede größere Procedure in meinem Programm auf eine Komponente auf dem Formular zugreift... ich denke also mit ner DLL komm ich da auch nicht weiter, ohne einen großen Aufwand zu betreiben.... das Progg is nämlich im Grund schon fertig, mir mit 1,5 mb nur etwas zu groß.. 
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 20.01.03 15:38
Und was bringt es das in DLL's auszulagern? Exe+DLL's = 1,5 MB Ich sehe da keinen Gewinn oder Sinn drin.
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mo 20.01.03 19:13
na die dll kann ich doch wieder "entladen"...
oder kennst du noch ne andere möglichkeit? mir wär alles recht, hauptsache nicht 1,5 mb exe.... 
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 20.01.03 21:08
UPX, aber das wäre dann die Holzhammer-Methode.
|
|
Sven
      
Beiträge: 314
D6 Ent, K3 Pro (patched)
|
Verfasst: Di 21.01.03 07:23
| kiwicht hat folgendes geschrieben: | aber ich hab doch unter USES
auch die main.pas angegeben... und bezüglich der form1 sagt er auch nix mehr, das scheint also erstmal zu funzen.
|
Nein!!! Nur weil Du unter USES die main.pas angibst, heißt das noch lange nicht, daß Deine Dll das Formular zur Laufzeit anspricht. Es heißt nur, daß Dein Hauptprogramm und Deine DLL, jeweils zur Laufzeit ein Formular erzeugen (können) welches denselben Namen trägt. Wenn Du zur Laufzeit auf Dein Hauptformular zugreifen willst, dann übergibst Du am besten das Fensterhandle an die Prozedur. Dann kannst Du über eine Iteration der Editfelder diese dann füllen. Die genauen Befehle dafür sind mir allerdings nicht geläufig, da ich solch merkwürdige Konstrukte zum füllen von Feldern nicht verwende.
Falls Du es Dir überlegst, und das füllen der Felder ins Hauptprogramm verlegst, dann wird Deine EXE nicht um >=500MB aufgebläht, sondern nur um 10-20 KB.
Gruß Sven
_________________ MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows
|
|
|