Autor Beitrag
Ak-Alex
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TMain.LoadFromURL(URL:String)
begin
  S:=....
end;


steht dann im Programm
//statische Deklaration
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function GetTextFromDLL(URL:String):Stringexternal 'Test.DLL';

procedure TMain.LoadFromURL(URL:String);
begin
  S:= GetTextFromDLL(URL);
end;


in deiner DLL:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
uses ShareMem; // wichtig bei Strings

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



BeitragVerfasst: 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



BeitragVerfasst: 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



BeitragVerfasst: Sa 11.10.03 16:23 
Hab momentag folgende Codes:

Dll Datei:

ausblenden volle Höhe 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;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }


uses
  SysUtils,
  Classes,sharemem,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
 function GetTextFromDLL(url:string) :string ; export;

begin


  result := url;


end;

 exports
  GetTextFromDLL;

  begin
end.



Programm Datei:

ausblenden volle Höhe 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
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 function GetTextFromDLL(URL:String):Stringexternal '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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
uses unit1;//<< dort steht die Deklaration der Form TMyForm
Procedure DLLCheckEditInForm(P:TMyForm);
begin
  P.Edit.Text:='hugo';
end;


und in deinem programm:
ausblenden 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: So 12.10.03 10:48 

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Ak-Alex
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 15.10.03 21:12 
kann ich auch eine procedure des forms ausführen?
Wenn ja wie?

Gruß

Alex
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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?
Ist die Frage beantwortet? Das Problem gelöst?

Dann klicke hier, um das Thema entsprechend zu markieren!