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]
mode 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;