Entwickler-Ecke
Dateizugriff - Umgang mit dll.....wie genau!
Anonymous - Sa 11.10.03 13:31
Titel: Umgang mit dll.....wie genau!
Also folgendes...Ich habe ein normales Programm welches ein Memo Feld intergriert hat....jetzt möchte mit dll's arbeiten...
Die dll datei soll eine text datei mittels
s := idhttp1.get('http://www.url.de/text.txt'); einlesen und soll sie dann an das Programm übermitteln (nämlich in das memo feld), wie genau stelle ich das an, meine bemühungen haben mir nicht weiter geholfen!
Gruß
Alex[/delphi]
MSCH - Sa 11.10.03 14:10
hmm, ich würd erstmal den gesamten Code in die Anwendung schreiben, hier ist das debuggen einfacher. Erst wenn dieser funktioniert lager den Code in eine DLL aus. D.h. wenn in deiner Anwendung stehen würde:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TMain.LoadFromURL(URL:String) begin S:=.... end; |
steht dann im Programm
//statische Deklaration
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| function GetTextFromDLL(URL:String):String; external 'Test.DLL';
procedure TMain.LoadFromURL(URL:String); begin S:= GetTextFromDLL(URL); end; |
in deiner DLL:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| uses ShareMem; function GetTextFromDLL(URL:String):String;export; begin ... end;
exports GetTextFromDLL index 1 name 'GetTextFromDLL'; end. |
sodele, alles ausm Kopf, wenn was nicht richtig war, bitte nochmal melden
grez
msch
Anonymous - Sa 11.10.03 15:02
Also irgendwie klappt das nicht, ich bekomm immer die Meldung
Procedure Einsprung gettextfromdll wurde nicht gefunden in test.dll
Anonymous - Sa 11.10.03 15:06
Ok, habs jetzt irgendwie aners gemacht, aber bekomme jetzt immer nach dem erscheinen des ergebnisses die fehlermeldung invalid pointer operation
Anonymous - Sa 11.10.03 15:23
Hab momentag folgende Codes:
Dll Datei:
Delphi-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: 26: 27: 28: 29: 30: 31: 32: 33:
| library Project2;
uses SysUtils, Classes,sharemem, Unit1 in 'Unit1.pas' ;
{$R *.res} function GetTextFromDLL(url:string) :string ; export;
begin
result := url;
end;
exports GetTextFromDLL;
begin end. |
Programm Datei:
Delphi-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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| unit programmdll;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm} function GetTextFromDLL(URL:String):String; external 'Test.DLL';
procedure TForm1.Button1Click(Sender: TObject); var s: string; begin s := Gettextfromdll(Edit1.Text); ShowMessage(s); end;
end. |
Soweit klappt alles, es kommt nur ghalt immer der Fehler auf invalid Pointer...
Gruß
Alex
P.S. Wie kann ich denn auf Komponenten Zugreifen...die in der unit1.pas liegen...z.B. idhttp ..Wie kann ich ein Form was in der dll liegt anzeigen lassen?
Motzi - Sa 11.10.03 15:58
ShareMem muss in beiden Units die erste Unit in der uses-Liste sein!
MSCH - Sa 11.10.03 17:12
lösche Unit1 noch aus der DLL, hat keinen Sinn und vergrößert nur die dll. Sonst kann ich keinen Fehler finden.
grez
msch
MSCH - Sa 11.10.03 17:19
| Zitat: |
| P.S. Wie kann ich denn auf Komponenten Zugreifen...die in der unit1.pas liegen...z.B. idhttp ..Wie kann ich ein Form was in der dll liegt anzeigen lassen? |
hmmm, sowas macht man eigentlich nicht - nennt sich kapselung und warum soll eine DLL eine externe Form kennen? Dann kannst du ja gleich den DLL-Code in die Form einbauen.
Sei's drum.
Also, um eine Externe Form in einer DLL zu verwenden, muss die DLL die Form-Deklaration kennen (sprich die Unit, siehe meine vorherigen Bemerkung).
Einer Funktion die die Form verwenden soll, musst du eine Referenz mitgeben:
z.b. in der DLL:
Delphi-Quelltext
1: 2: 3: 4: 5:
| uses unit1;Procedure DLLCheckEditInForm(P:TMyForm); begin P.Edit.Text:='hugo'; end; |
und in deinem programm:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure DLLCheckEditInForm(T:TMyForm);external 'Test.dll';
procedure MyForm.DLLCode; begin DLLCheckEditInForm(Self); end; |
wichtig: beide Programme, also auch die DLL müssen die gleiche Version besitzen. Sprich du kannst nicht nur das Programm (die TMyForm) ändern, OHNE die DLL neu zu compilieren. Ansonsten stimmt das, was die DLL verwendet nicht mit dem Original mehr überein.
grez
msch
Anonymous - Sa 11.10.03 18:50
Also ist (P:TMyForm) die Referenz oder wie darf ich das verstehen...
Irgendwie komme ich da nicht hinter...
Ich brauche mal ein konkretes Beispiel wie ich z.B. ein Form und die damit verbundenen Komponenten wie idhttp benutze...
ich blick das nicht so ganz..
Alex
P.S. Es geht um eine Art Plugin implementierung, deswegen auch die Forms in der Dll...
MSCH - Sa 11.10.03 20:25
also,
wenn du in einer DLL eine Form einer anderen Anwendung verwenden willst, muss die DLL die Formdeklaration (die Klasse) kennen. Dies tust du indem du die Unit einbindest. Aber damit ist es nicht getan. Da die Form in deinem Programm instantiiert wird (MyForm:= TMyForm.Create) ist sie nur "dort auch im Speicher vorhanden". Natürlich ist sie auch für die DLL im Speicher, nur die DLL muss die Adresse kennen.
Damit deine Funktionen in der DLL auf die richtige Instanz zugreifen, musst du jeder Funktion in der DLL oder der DLL beim Laden den "Zeiger" (in diesem Beispiel MyForm) mitgeben.
Wenn dein Hauptprogramm also eine X-beliebige Komponente verwendet, kennt sie die DLL auch und du kannst dort beliebig nutzen.
In deiner Form nutzt du jede Komponente über den Namen. Z.b. Edit1.text:='blabla'. In deiner DLL schreibst du P.Edit.text:='blabla';
(Beispiel siehe oben)
grez
msch
Anonymous - So 12.10.03 06:19
ok, ich hoffe mal ich bekomm das hin...probier mal rum!
Danke für die Hilfe!
Gruß
Alex
Anonymous - Mi 15.10.03 20:12
kann ich auch eine procedure des forms ausführen?
Wenn ja wie?
Gruß
Alex
MSCH - Do 16.10.03 09:19
| Ak-Alex hat folgendes geschrieben: |
kann ich auch eine procedure des forms ausführen?
Wenn ja wie?
Gruß
Alex |
Wenn du sowas machen willst, prüfe mal deinen Code auf Kapselung und ob du überhaupt eine DLL brauchst. Es ist imho nicht im sinne des Erfinders, aus DLLs proceduren aufzurufen, die dem "PArent" gehören. Theoretisch geht das nur, wenn du in deiner DLL dem Aufrufer eine Message sendest.
grez
msch
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!