Thema: Rar Dll

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#25

AW: Rar Dll

  Alt 16. Jul 2010, 06:26
krass, ich glaub ich hatte mein Lazarus gerade zum ersten mal dieses Jahr wieder verwendet

joar, im objfpc-Mode hat Lazarus, bzw. der FPC irgendein (krankes) Problem mit Funktionszeigern (den ganzen hier benötigten @-Geschichten) ... kein Wunder daß der Code, für mich als Delphianer irgendwie korrekt aussah und eigentlich funktionieren hätte müssen.

tausch mal das {$mode objfpc}{$H+} gegen {$mode delphi} .
(mit der delphikompatiblen Syntax scheint es jedenfalls zu funktionieren)

ansonsten ... nja, k.A. wie man solche Sachen sonst in der "normalen" FPC-Syntax angeben muß ... entweder kann/kennt FPC sowas nicht oder die haben irgendeine andere (kranke) Syntax dafür.


[edit]
Bei Google suchenmode objfpc GetProcAddress lieferte z.B. Folgendes:
http://www.lazarusforum.de/viewtopic.php?f=55&t=3292
hier ist auch ein Beispiel mit enthalten http://wiki.lazarus.freepascal.org/Hardware_Access/de

PS: im Lazarus-Wiki/-Forum findet man zu solchen lazarus-, bzw. fpc-spezifischen Problemem bestimmt öfters mal eine Lösung

[edit2]

Delphi-Quellcode:
function RARDllGetVersion: integer;
begin
  if @RARGetDllVersion = nil then
    Result:= 0;
  else
    Result := RARGetDllVersion()
  // der (leere) Parameter "()" markiert es als Funktionsaufruf
  // sowas muß z.B. auch in den meißten C-#hnlichen Sprachen
  // gemacht werden, wobei "Delphi" soetwas aber automatisch erkennt
end;

function UnrarDllLoad(const dllfilename : string) : Boolean;
begin
  Result := False;
  UnrarDllHandle := LoadLibrary(PChar(dllfilename));
  if UnrarDllHandle <> 0 then
  begin
    RAROpenArchive := TRAROpenArchive (GetProcAddress(UnrarDllHandle, 'RAROpenArchive'));
    RAROpenArchiveEx := TRAROpenARchiveEx(GetProcAddress(UnrarDllHandle, 'RAROpenArchiveEx'));
    RARCloseArchive := TRARCloseArchive (GetProcAddress(UnrarDllHandle, 'RARCloseArchive'));
    RARReadHeader := TRARReadHeader (GetProcAddress(UnrarDllHandle, 'RARReadHeader'));
    RARReadHeaderEx := TRARReadHeaderEx (GetProcAddress(UnrarDllHandle, 'RARReadHeaderEx'));
    RARProcessFile := TRARProcessFile (GetProcAddress(UnrarDllHandle, 'RARProcessFile'));
    RARSetCallback := TRARSetCallback (GetProcAddress(UnrarDllHandle, 'RARSetCallback'));
    RARSetPassword := TRARSetPassword (GetProcAddress(UnrarDllHandle, 'RARSetPassword'));
    RARGetDllVersion := TRARGetDllVersion(GetProcAddress(UnrarDllHandle, 'RARGetDllVersion'));
    if (@RAROpenArchive = nil) or (@RARCloseArchive = nil) or
       (@RARReadHeader = nil) or (@RARProcessFile = nil) or
       (@RARSetPassword = nil) or (@RARSetCallback = nil) or
       (@RAROpenArchiveEx = nil) or (@RARReadHeaderEx = nil) then
      FreeLibrary(UnrarDllHandle)
    else
      Result := True;
  end;
end;
einen leeren Try-Except-Block macht man einfach nicht
entweder man behandelt einen Fehler oder man läßt ihn zu.
Fehler einfach so zu unterdrücken gibt's nicht, denn so bekommt man ja nie mit, ob und warum etwas "nicht" passiert.

Und Assigned kann auch manchmal nett sein:
Delphi-Quellcode:
function RARDllGetVersion: integer;
begin
  if Assigned(RARGetDllVersion) then
    Result := RARGetDllVersion()
  else
    Result:= 0;
end;

function UnrarDllLoad(const dllfilename : string) : Boolean;
begin
    ...
    if Assigned(RAROpenArchive) and Assigned(RARCloseArchive) and
       Assigned(RARReadHeader) and Assigned(RARProcessFile) and
       Assigned(RARSetPassword) and Assigned(RARSetCallback) and
       Assigned(RAROpenArchiveEx) and Assigned(RARReadHeaderEx) then
      Result := True
    else
      FreeLibrary(UnrarDllHandle);
  end;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (16. Jul 2010 um 07:09 Uhr)
  Mit Zitat antworten Zitat