Autor |
Beitrag |
Ak-Alex
Gast
Erhaltene Danke: 1
|
Verfasst: Sa 11.10.03 14:31
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
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 11.10.03 15: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
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Ak-Alex
Gast
Erhaltene Danke: 1
|
Verfasst: Sa 11.10.03 16:02
Also irgendwie klappt das nicht, ich bekomm immer die Meldung
Procedure Einsprung gettextfromdll wurde nicht gefunden in test.dll
|
|
Ak-Alex
Gast
Erhaltene Danke: 1
|
Verfasst: Sa 11.10.03 16:06
Ok, habs jetzt irgendwie aners gemacht, aber bekomme jetzt immer nach dem erscheinen des ergebnisses die fehlermeldung invalid pointer operation
|
|
Ak-Alex
Gast
Erhaltene Danke: 1
|
Verfasst: Sa 11.10.03 16:23
Hab momentag folgende Codes:
Dll Datei:
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:
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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 11.10.03 16:58
ShareMem muss in beiden Units die erste Unit in der uses-Liste sein!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 11.10.03 18: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
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 11.10.03 18: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
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Ak-Alex
Gast
Erhaltene Danke: 1
|
Verfasst: Sa 11.10.03 19: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
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 11.10.03 21: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
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Ak-Alex
Gast
Erhaltene Danke: 1
|
Verfasst: So 12.10.03 07:19
ok, ich hoffe mal ich bekomm das hin...probier mal rum!
Danke für die Hilfe!
Gruß
Alex
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: So 12.10.03 10:48
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Ak-Alex
Gast
Erhaltene Danke: 1
|
Verfasst: Mi 15.10.03 21:12
kann ich auch eine procedure des forms ausführen?
Wenn ja wie?
Gruß
Alex
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Do 16.10.03 10: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
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|