AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Anfängerfrage zu DLL

Ein Thema von iphi · begonnen am 18. Jan 2010 · letzter Beitrag vom 25. Jan 2010
Antwort Antwort
Seite 2 von 2     12
iphi

Registriert seit: 13. Feb 2009
244 Beiträge
 
Delphi 7 Personal
 
#11

Re: Anfängerfrage zu DLL

  Alt 18. Jan 2010, 20:18
Zitat:
Suche mal nach DLLMain!
Danke, das war sehr hilfreich!
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:
Die Abschnitte gehören zwischen "begin..end;" und dem "end." Also nach dem quasi "Hauptprogramm", nicht davor.
Kann es sein, dass das nur in einer Unit, nicht aber in einer Library so funktioniert?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Anfängerfrage zu DLL

  Alt 19. Jan 2010, 17:05
Zitat von iphi:
Zitat:
Suche mal nach DLLMain!
Danke, das war sehr hilfreich!
Der Teil zwischen begin ... end. wird beim Laden der DLL durchlaufen, richtig?
Hmmm, naja. Du musst erstmal wisse, wo eine DLL im Speicher liegt, und dann wie die verschiedenen Prozesse auf diese DLL darauf zugreifen und wann sie wirklich "entladen" wird.

Zitat:
Da kann ich meine DLL-Callback Funktion setzen.
Was für eine Callback-Funktion?

Zitat:
Noch eine Frage:
Neues Thema, oder?

Zitat:
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?
Was ist das für eine Komponente? Nur eine Komponente oder gleich ein Control?
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:
Kann es sein, dass das nur in einer Unit, nicht aber in einer Library so funktioniert?
[/quote]
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von MisterNiceGuy
MisterNiceGuy

Registriert seit: 1. Jul 2003
Ort: Mannheim
919 Beiträge
 
Delphi 7 Personal
 
#13

Re: Anfängerfrage zu DLL

  Alt 19. Jan 2010, 17:24
OT: Yeah, an 6. Stelle steht bei Google mein DLL-Tutorial
Jonas
Wenn mich jemand sucht, ich bin im Kühlschrank!

Informationen über das Duale Studium
www.jofre.de
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
244 Beiträge
 
Delphi 7 Personal
 
#14

Re: Anfängerfrage zu DLL

  Alt 19. Jan 2010, 20:53
Zitat:
Was für eine Callback-Funktion?
DLLMain ist doch so was wie eine Callback Funktion.
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:
Was ist das für eine Komponente?
Es geht um die TJvHidDeviceController-Komponente, die ich in eine DLL kapseln will.
Wen lasse ich da den DeviceChange-Event empfangen, wenn mein TJvHidDeviceController-Objekt kein Fenster als Ahn hat?
  Mit Zitat antworten Zitat
Wal

Registriert seit: 22. Sep 2006
56 Beiträge
 
#15

Re: Anfängerfrage zu DLL

  Alt 25. Jan 2010, 07:04
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.
Angehängte Dateien
Dateityp: zip hqctdll_176.zip (11,2 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 01:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf