Einzelnen Beitrag anzeigen

Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#1

LoadLibary Exports aus Exe / Aufruf aus DLL

  Alt 27. Aug 2012, 23:16
Hallo Delphianer,

ich weiß der Titel ist nicht gerade schön formuliert aber mit fällt keine bessere Bezeichnung ein.

Habe eigentlich nur eine Frage ob mein Vorgehen ohne Probleme funktioniert. Derzeit läuft es aber ich weiß ja nicht ob ich nicht doch irgendwann auf nen Knall hinaus laufe.

Ich habe ein Programm welches Daten an Module mittels Exports zur Verfügung stellen soll.
Derzeit zwei einfache Funktionen. Einen Wert aus einer Datenbank auslesen und ins Log schreiben.

Mein Programm:
Delphi-Quellcode:
function WriteLog(MessageType: Integer; Msg: PChar): Boolean; stdcall;
begin
  if MRSession <> nil then
    Result := MRSession.WriteLog(MessageType, Msg)
  else
    Result := False;
end;

function GetValue(Ident: PChar; var Value: PChar): Boolean; stdcall;
  var
    test: string;
begin
  if MRSession <> nil then begin
    Result := MRSession.GetValue(Ident, test);
    Value := PChar(test);
  end
  else
    Result := False;
end;

procedure Test; stdcall;
begin
  ShowMessage('test');
end;

exports
  WriteLog, GetValue, Test;
Die Test DLL
Delphi-Quellcode:
type
  TFunc1 = function (MessageType: Integer; Msg: PChar): Boolean; stdcall;
  TFunc2 = function (Ident: PChar; var Value: PChar): Boolean; stdcall;
  Ttest = procedure;

function Execute(MHandle: Cardinal; Path: PChar; SessionKey: PChar; ModeratorID: Integer): Integer; stdcall;
  var
    FC1: TFunc1;
    FC2: TFunc2;
    Value: PChar;
    Test: Ttest;
    ph: Cardinal;
begin
  ph := LoadLibrary('.\ModiAdmin.exe');
  if ph = 0 then
    ShowMessage('Scheissendreck');
  try
    ShowMessage('EXECUTE');
    @FC1 := GetProcAddress(ph, 'WriteLog');
    @FC2 := GetProcAddress(ph, 'GetValue');
    @Test := GetProcAddress(ph, 'Test');

    if @FC1 = nil then
      ShowMessage('ERROR WriteLog');

    if @FC2 = nil then
      ShowMessage('ERROR GetValue');

    Test;
    FC1(1, 'Hallo hier bin ich');
    FC2('Host', Value);
    ShowMessage(Value);
  finally

  end;

  Result := 30;
end;
Sind nur Auszüge und eben auf die Schnelle zum testen. Es funktioniert auch eben, ich möchte nun wissen ob die Methode soweit in Ordnung ist. GetValue und WriteLog sollen später natürlich über die aktive Instanz ausgeführt werden.

das WriteLog könnte ich noch über PostMessage realisieren aber bei GetValue habe ich ja einen Wert den ich fülle.

Sollte das keine schöne bzw. sichere Methode sein, gibts dann alternativen?

Gruß
Cyber
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat