Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DLL und Komponenten (https://www.delphipraxis.net/99815-dll-und-komponenten.html)

Tim Henford 18. Sep 2007 08:24


DLL und Komponenten
 
Hallo,

mal eine wohl recht simple Frage:
Wie kann man eine bestimmte nicht visuelle Komponente, die man ja sonst auf einer Form in einer Anwendung hat (in meinem Fall eine TAdoConnect) in eine DLL ohne Forms packen?
Sodass diese Komponente gleich "created" wird, also zur Verfügung steht, wenn die DLL geladen wurde und man somit die ganze Zeit darauf zugreifen kann.
...und am Ende natürlich wieder "freen". ;)


Danke

mkinzler 18. Sep 2007 08:25

Re: DLL und Komponenten
 
So einfach nicht.

oki 18. Sep 2007 08:29

Re: DLL und Komponenten
 
Warum soll die Kompo für die Design-Zeit in die DLL?

Gruß oki

Bernhard Geyer 18. Sep 2007 08:29

Re: DLL und Komponenten
 
Ohne gemeinsame Laufzeitpackages kannst du schon gar keine "lebenden" Objekte aus einer DLL in der Exe zur verfügung stellen.

SirThornberry 18. Sep 2007 08:33

Re: DLL und Komponenten
 
alles was du zwischen begin und end in der DLL packst wird beim laden der DLL ausgeführt.
Wenn du beim laden und entladen etwas machen willst ist die einfachste variante eine neue Unit anzulegen (welche du dann in die dll einbinden musst) und dort folgendes:
Delphi-Quellcode:
unit Unitname;

interface

implementation

initialization
  //beim laden

finalization
  //beim entladen

end.

Tim Henford 20. Sep 2007 10:17

Re: DLL und Komponenten
 
es geht darum, dass die DLL auch mit anderen Programmierumgebung aufgerufen werden kann und die AdoConnection vereinfacht in einer DLL untergebracht ist...
Ich habe gelesen mit Datamoduls könnte das was werden?

Ich habe es folgendermaßen probiert nach A.Kosch:

Delphi-Quellcode:
library ADOinDLL;

uses
SysUtils, Windows, Classes, ActiveX,
ADOinDLL_DM in 'ADOinDLL_DM.pas' {DataModule1: TDataModule};

{$R *.res}

procedure ShowData; stdcall;
var
iCount : Integer;
begin
CoInitialize(nil);
try
DataModule1 := TDataModule1.Create(nil);
try
DataModule1.ADOConnection1.Connected := True;
DataModule1.ADODataSet1.Active := True;
iCount := DataModule1.ADODataSet1COLUMN1.Value;
DataModule1.ADODataSet1.Active := False;
DataModule1.ADOConnection1.Connected := False;
finally
DataModule1.Free;
end;
finally
CoUninitialize;
end;
MessageBox(0, PChar(IntToStr(iCount)), 'SELECT Count(*) FROM Categories', 0);
end;

exports
ShowData;

begin
end.

Der Client ruft die exportierte Schnittstellenprozedur der dynamisch importierten DLL auf:


Delphi-Quellcode:
type
TShowData = procedure;
var
aShowData : TShowData;

procedure TForm1.Button1Click(Sender: TObject);
var
hDLL : THandle;
begin
hDLL := LoadLibrary('C:\Ablage\ADOinDLL.dll');
if hDLL = 0 then
begin
ShowMessage('DLL kann nicht geladen werden');
Abort;
end;
@aShowData := GetProcAddress(hDLL, 'ShowData');
if Assigned(aShowData) then
aShowData;
FreeLibrary(hDLL);
end;
Doch bei mir kommt da permanent Exception EOLEException in module...?

...ok korrektur ...nun klappts, es lag an der adoconnection...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz