Anfängerfrage zu DLL
Hallo,
ich möchte einen Teil meines Codes in eine DLL auslagern. Bei welcher Gelegenheit erzeugt man denn innerhalb der DLL lokale Datenstrukturen, die so lange leben sollen wie die DLL geladen ist? Gibt es bei einer DLL so etwas wie einen OnLoad-Event oder muss ich hierfür in der DLL einfach eine Ini-Prozedur vorsehen, die ich dann zu Fuß aufrufen muss? Danke, Thomas |
Re: Anfängerfrage zu DLL
Dafür dient der Initialisierungsteil der Dll
|
Re: Anfängerfrage zu DLL
Ich würde solche Dinge im initialization und finalization Teil machen.
|
Re: Anfängerfrage zu DLL
Wie sieht denn die Initialization und Finalization Struktur in einer DLL aus?
Delphi-Quellcode:
So compiliert das nicht.
library test;
uses SysUtils, Classes, {$R *.res} function DLLpi(i,j:integer): integer; cdecl; export; begin Result:=314*i+j ; end; exports DLLpi; initialization ; finalization ; begin end. |
Re: Anfängerfrage zu DLL
Es steht ja uch nichts drin.
|
Re: Anfängerfrage zu DLL
Der Compiler stört sich an Initialization an dieser Stelle, nicht daran, dass nicts drin steht.
Kann mir bitte jemand ein kurzes Beispiel zeigen wie die DLL-Struktur mit Initialisierung und Abschluss richtig aussehen muss? Danke. |
Re: Anfängerfrage zu DLL
Schon mal Google bemüht? Delphi DLL Tutorial
|
Re: Anfängerfrage zu DLL
Zitat:
Ich dachte, hier kann mir jemand helfen. |
Re: Anfängerfrage zu DLL
Suche mal nach DLLMain!
|
Re: Anfängerfrage zu DLL
Die Abschnitte gehören zwischen "begin..end;" und dem "end." Also nach dem quasi "Hauptprogramm", nicht davor.
|
Re: Anfängerfrage zu DLL
Zitat:
Der Teil zwischen begin ... end. wird beim Laden der DLL durchlaufen, richtig? Da kann ich meine DLL-Callback Funktion setzen. Noch eine Frage: Ich möchte in meiner DLL eine Komponente benutzen, die normalerweise auf einer Form "lebt". Kann ich innerhalb der DLL ein unsichtbares Fenster erzeugen und wenn ja, wie? Kann dieses unsichtbare Fenster dann auch Windowsmessages empfangen? Zitat:
|
Re: Anfängerfrage zu DLL
Zitat:
Zitat:
Zitat:
Zitat:
Auch unsichtbare Fenster empfangen Nachrichten (das unsichtbarste Fenster kannst du mit "allocatehwnd" erstellen). Das Problem kann bei dir nur sein, dass die Nachrichtenschleife im Hauptprogramm ist. Das solltest du im Auge behalten. Zitat:
jep. Wobei auch Librarys aus mehreren Units bestehen können. Aber das Hauptprogram (*.dpr) kennt keine derartigen Abschnitte. Und ich erinnere mich dunkel, dass die Library in Units diese Abschnitte nicht oder nur bedingt ausführt. |
Re: Anfängerfrage zu DLL
OT: Yeah, an 6. Stelle steht bei Google mein DLL-Tutorial :D
|
Re: Anfängerfrage zu DLL
Zitat:
DLLProc wird die Adresse von DLLMain zugewiesen, so dass DLLMain beim Laden und Entladen der DLL aufgerufen wird. Die Zuweisung findet wohl sinnvollerweise in dem begin ... end. Block der DLL statt. Das funktioniert so weit prima. Zitat:
Wen lasse ich da den DeviceChange-Event empfangen, wenn mein TJvHidDeviceController-Objekt kein Fenster als Ahn hat? |
Re: Anfängerfrage zu DLL
Liste der Anhänge anzeigen (Anzahl: 1)
Hatte mal eine Ansteuerung für ein USBRadio(jvhidkompo) mit Callbackfunktion in eine Dll umgesetzt, evtl. kann es für dich nützlich sein.
Die Ansteuerung war nicht von mir, nur die Dll-Umsetzung. Das Laden der Dll und Auswerten des Callback ging so:
Delphi-Quellcode:
unit RadioDllWrapper;
interface uses Windows, StrUtils, IniFiles; type TFNInitRadio = procedure(strPath: PChar); stdcall; TFNCloseRadio = procedure; stdcall; TFNSetRadioFrequenz = procedure(Value: Integer; Tuner: Boolean); stdcall; TFNSetRadioIntervall = procedure(Value: Integer); stdcall; TFNScanRadio = procedure(direction: Boolean; Tuner: Boolean); stdcall; TFNSeekRadio = procedure(direction: Boolean; Tuner: Boolean); stdcall; TFNSetRadioVolume = procedure(Value: Integer); stdcall; TFNSetRadioBass = procedure(Value: Integer); stdcall; TFNSetRadioTreble = procedure(Value: Integer); stdcall; TFNSetRadioLoudnessOn = procedure(Value: Boolean); stdcall; TFNSetRadioLoudnessStep = procedure(Value: Boolean); stdcall; TFNSetRadioVolumeStep = procedure(Value: Boolean); stdcall; TFNSetRadioFaderStep = procedure(Value: Boolean); stdcall; TFNSetRadioBalanceStep = procedure(Value: Boolean); stdcall; TFNSetRadioBassStep = procedure(Value: Boolean); stdcall; TFNSetRadioTrebleStep = procedure(Value: Boolean); stdcall; TFNSetRadioMute = procedure(Value: Boolean); stdcall; TFNSetRadioRemote = procedure(Value: Boolean); stdcall; TFNSetRadioLoudness = procedure(Value: Integer); stdcall; TFNSetRadioBalance = procedure(Value: Integer); stdcall; TFNSetRadioFader = procedure(Value: Integer); stdcall; TFNSetRadioAntenne = procedure(Tuner: Boolean; Antenne: Boolean); stdcall; TFNSetRadioAFOn = procedure(Value: Boolean); stdcall; TFNSaveRadioValue = procedure; stdcall; TFNRadioCallBack = procedure(Value: Pointer); stdcall; function LoadRadioDll: Boolean; function CloseRadioDll: Boolean; //Dll-Callback procedure RCallBack(Index: Integer; Data: PChar; IntData: Integer); const RADIO_CLOSE = 0; RADIO_OPEN = 1; RADIO_FRQ1 = 2; RADIO_FRQ2 = 3; RADIO_PI1 = 4; RADIO_PI2 = 5; RADIO_FS1 = 6; RADIO_FS2 = 7; RADIO_RDSNAME1 = 8; RADIO_RDSNAME2 = 9; RADIO_RDSTEXT1 = 10; RADIO_RDSTEXT2 = 11; RADIO_PTY1 = 12; RADIO_PTY2 = 13; RADIO_MONO1 = 14; RADIO_MONO2 = 15; RADIO_TP1 = 16; RADIO_TP2 = 17; RADIO_INTERVALL = 200; RADIO_REMOTE = 201; RADIO_ERROR = 255; RADIO_MESSAGE = 100; var InitRadio: TFNInitRadio= nil; CloseRadio: TFNCloseRadio = nil; SetRadioFrequenz: TFNSetRadioFrequenz = nil; SetRadioIntervall: TFNSetRadioIntervall = nil; ScanRadio: TFNScanRadio = nil; SeekRadio: TFNSeekRadio = nil; SetRadioVolume: TFNSetRadioVolume = nil; SetRadioBass: TFNSetRadioBass = nil; SetRadioTreble: TFNSetRadioTreble = nil; SetRadioLoudnessOn: TFNSetRadioLoudnessOn = nil; SetRadioLoudnessStep: TFNSetRadioLoudnessStep = nil; SetRadioVolumeStep: TFNSetRadioVolumeStep = nil; SetRadioFaderStep: TFNSetRadioFaderStep = nil; SetRadioBalanceStep: TFNSetRadioBalanceStep = nil; SetRadioBassStep: TFNSetRadioBassStep = nil; SetRadioTrebleStep: TFNSetRadioTrebleStep = nil; SetRadioMute: TFNSetRadioMute = nil; SetRadioRemote: TFNSetRadioRemote = nil; SetRadioLoudness: TFNSetRadioLoudness = nil; SetRadioBalance: TFNSetRadioBalance = nil; SetRadioFader: TFNSetRadioFader = nil; SetRadioAntenne: TFNSetRadioAntenne = nil; SetRadioAFOn: TFNSetRadioAFOn = nil; SaveRadioValue: TFNSaveRadioValue = nil; RadioCallBack: TFNRadioCallBack = nil; RadioLib: HMODULE; implementation uses Radio, RadioUnit; function LoadRadioDll: Boolean; var ini: TMemIniFile; RadioDll: String; begin result := False; try Ini:=TMemIniFile.Create('Radio.ini'); RadioDll := Ini.ReadString('Global','RadioDll',''); finally ini.Free; end; if RadioDll <> '' then RadioLib := LoadLibrary(PChar(RadioDll)); if RadioLib <> 0 then begin @InitRadio := GetProcAddress(RadioLib, 'InitRadio'); @CloseRadio := GetProcAddress(RadioLib, 'CloseRadio'); @SetRadioFrequenz := GetProcAddress(RadioLib, 'SetRadioFrequenz'); @SetRadioIntervall := GetProcAddress(RadioLib, 'SetRadioIntervall'); @ScanRadio := GetProcAddress(RadioLib, 'ScanRadio'); @SeekRadio := GetProcAddress(RadioLib, 'SeekRadio'); @SetRadioVolume := GetProcAddress(RadioLib, 'SetRadioVolume'); @SetRadioBass := GetProcAddress(RadioLib, 'SetRadioBass'); @SetRadioTreble := GetProcAddress(RadioLib, 'SetRadioTreble'); @SetRadioLoudnessOn := GetProcAddress(RadioLib, 'SetRadioLoudnessOn'); @SetRadioLoudnessStep := GetProcAddress(RadioLib, 'SetRadioLoudnessStep'); @SetRadioVolumeStep := GetProcAddress(RadioLib, 'SetRadioVolumeStep'); @SetRadioFaderStep := GetProcAddress(RadioLib, 'SetRadioFaderStep'); @SetRadioBalanceStep := GetProcAddress(RadioLib, 'SetRadioBalanceStep'); @SetRadioBassStep := GetProcAddress(RadioLib, 'SetRadioBassStep'); @SetRadioTrebleStep := GetProcAddress(RadioLib, 'SetRadioTrebleStep'); @SetRadioMute := GetProcAddress(RadioLib, 'SetRadioMute'); @SetRadioRemote := GetProcAddress(RadioLib, 'SetRadioRemote'); @SetRadioLoudness := GetProcAddress(RadioLib, 'SetRadioLoudness'); @SetRadioBalance := GetProcAddress(RadioLib, 'SetRadioBalance'); @SetRadioFader := GetProcAddress(RadioLib, 'SetRadioFader'); @SetRadioAntenne := GetProcAddress(RadioLib, 'SetRadioAntenne'); @SetRadioAFOn := GetProcAddress(RadioLib, 'SetRadioAFOn'); @SaveRadioValue := GetProcAddress(RadioLib, 'SaveRadioValue'); @RadioCallBack := GetProcAddress(RadioLib, 'RadioCallBack'); result := True; end; end; function CloseRadioDll: Boolean; begin if RadioLib <> 0 then begin FreeLibrary(RadioLib); result := True; end else result := False; end; //Diese Funktion soll das Hauptprogramm aufrufen bei einer Dll-Nachricht procedure RCallBack(Index: Integer; Data: PChar; IntData: Integer); begin case Index of RADIO_CLOSE : begin RadioOn := False; end; RADIO_OPEN : begin SetRadioFrequenz(LastRadioFrq, False); SetRadioMute(False); if RadioAF then SetRadioAFOn(True); RadioOn := True; end; RADIO_FRQ1 : begin frmMain.Flash.SetVariable('RADIOFREQ', String(Data)); RadioFrequenz1 := String(Data); Frequenz := IntData; end; RADIO_FRQ2 : begin frmMain.Flash.SetVariable('AFFREQ', String(Data)); end; RADIO_PI1 : begin frmMain.Flash.SetVariable('PICODE', String(Data)); PICode := String(Data); frmMain.Flash.SetVariable('RADIOLOGO', AppPath + '\Radio\' + PICode + '.jpg'); end; RADIO_PI2 : begin frmMain.Flash.SetVariable('AFPICODE', String(Data)); end; RADIO_FS1 : begin frmMain.Flash.SetVariable('RDSSIGNAL', String(Data)); end; RADIO_FS2 : begin frmMain.Flash.SetVariable('AFFS', String(Data)); end; RADIO_RDSNAME1 : begin frmMain.Flash.SetVariable('RDSNAME', String(Data)); Radioname := String(Data); end; RADIO_RDSNAME2 : begin end; RADIO_RDSTEXT1 : begin frmMain.Flash.SetVariable('RDSTEXT', String(Data)); end; RADIO_RDSTEXT2 : begin end; RADIO_PTY1 : begin frmMain.Flash.SetVariable('RADIOGENRE', String(Data)); end; RADIO_PTY2 : begin end; RADIO_MONO1 : begin frmMain.Flash.SetVariable('RADIOSTEREO', String(Data)); end; RADIO_MONO2 : begin end; RADIO_TP1 : begin frmMain.Flash.SetVariable('TP', String(Data)); end; RADIO_TP2 : begin end; RADIO_INTERVALL : begin OutputDebugString(Data); end; RADIO_REMOTE : begin frmMain.Remote(IntData); end; RADIO_ERROR : begin OutputDebugString(Data); end; RADIO_MESSAGE : begin OutputDebugString(Data); end; end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz