AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Rar Dll

Ein Thema von 1234567890987654321 · begonnen am 15. Jul 2010 · letzter Beitrag vom 22. Sep 2010
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von himitsu
himitsu

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

AW: Rar Dll

  Alt 15. Jul 2010, 08:53
Und den absoluten Pfad anzugeben ist auch nicht sonderlich gut.
(abgesehn davon, daß solche DLLs nicht nach C:\ gehören)

Ohne Pfad ... external 'urar.dll'; sollte ausreichen
das System sucht sich dann die DLL in den allgemein gültigen Verzeichnissen (Programmverzeichnis, Windos/System32 und andere global registrierte Pfade/%PATH% )
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Jul 2010 um 09:13 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Rar Dll

  Alt 15. Jul 2010, 08:59
Hallo,

da in der unrar.pas kein PRAROpenArchiveData definiert ist,
würde ich es so machen

function RAROpenArchive(var ArchiveData: TRAROpenArchiveData) XXX oder du ergänzt die pas-Datei

Delphi-Quellcode:
PRAROpenArchiveData = ^TRAROpenArchiveData;
TRAROpenArchiveData = packed record


Heiko
Heiko
  Mit Zitat antworten Zitat
1234567890987654321

Registriert seit: 8. Jun 2010
73 Beiträge
 
#3

AW: Rar Dll

  Alt 15. Jul 2010, 09:00
Lazarus kommt mit den @ nicht klar:
unit1.pas(168,14) Error: Incompatible types: got "<procedure variable type of function:LongInt;StdCall>" expected "LongInt"
unit1.pas(183,7) Error: Can't assign values to an address
unit1.pas(184,7) Error: Can't assign values to an address
unit1.pas(185,7) Error: Can't assign values to an address
unit1.pas(186,7) Error: Can't assign values to an address
unit1.pas(187,7) Error: Can't assign values to an address
unit1.pas(188,7) Error: Can't assign values to an address
unit1.pas(189,7) Error: Can't assign values to an address
unit1.pas(190,7) Error: Can't assign values to an address
unit1.pas(191,7) Error: Can't assign values to an address
unit1.pas(219,31) Error: Incompatible types: got "Constant String" expected "TRAROpenArchiveData"
unit1.pas(228) Fatal: There were 13 errors compiling module, stopping
ACHTUNG: ICH VERWENDE LAZARUS
  Mit Zitat antworten Zitat
1234567890987654321

Registriert seit: 8. Jun 2010
73 Beiträge
 
#4

AW: Rar Dll

  Alt 15. Jul 2010, 09:17
Und noch eine Frage:
Wie entpacke ich mit der unrar.pas?
ACHTUNG: ICH VERWENDE LAZARUS
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Rar Dll

  Alt 15. Jul 2010, 17:08
Einfach nur "uninformative" Posts zum Zwecke des Pushens (nach oben holens) werden halt nicht gern gesehn, auserdem bringen sie garnichts, da viele sowieso nicht nur auf der Startseite/Portal nachsehn (ich schau mit z.B. auch oftmals alle Post seit dem letzen Besuch so grob duch, ob was dabei war)

Bei "wichtigen" Änderungen/Informationen kann man 24 Stunden lang seine Beiträge editieren und wenn es wirklich grundlegend Neues/Wichtiges zu sagen gibt, dann hat auch keiner was gegen einen Doppelpost/Pushen.

PS: nicht alle, welche etwas zu einem Thema sagen können, sind ständig online, also ist es garnicht immer möglich daß immer sofort eine Antwort kommt (auch wenn es hier einigen oftmals zu schnell geht und nach nimma 'ner Minute einer antwortet)

PSS: die Syntax von Lazarus ist auch etwas anders, als die von Delphi und da nicht soooo viele hier Lazarus/FPC benutzen, ist es da eh etwas schwieriger.


So, nun wieder zum Topic/Thema:
- wie sieht denn dein Code nun aktuell aus?
- manchmal sind auch Beispiel-/Testprogramme nicht schlecht
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Jul 2010 um 17:11 Uhr)
  Mit Zitat antworten Zitat
1234567890987654321

Registriert seit: 8. Jun 2010
73 Beiträge
 
#6

AW: Rar Dll

  Alt 15. Jul 2010, 21:01
Na gut, sorry.

Hier der Code:
Delphi-Quellcode:
unit Unrar;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,Windows;

  const
  ERAR_END_ARCHIVE = 10;
  ERAR_NO_MEMORY = 11;
  ERAR_BAD_DATA = 12;
  ERAR_BAD_ARCHIVE = 13;
  ERAR_UNKNOWN_FORMAT = 14;
  ERAR_EOPEN = 15;
  ERAR_ECREATE = 16;
  ERAR_ECLOSE = 17;
  ERAR_EREAD = 18;
  ERAR_EWRITE = 19;
  ERAR_SMALL_BUF = 20;
  ERAR_UNKNOWN = 21;

  RAR_OM_LIST = 0;
  RAR_OM_EXTRACT = 1;

  RAR_SKIP = 0;
  RAR_TEST = 1;
  RAR_EXTRACT = 2;

  RAR_VOL_ASK = 0;
  RAR_VOL_NOTIFY = 1;

  RAR_DLL_VERSION = 3;

  UCM_CHANGEVOLUME = 0;
  UCM_PROCESSDATA = 1;
  UCM_NEEDPASSWORD = 2;


type
   TRARHeaderData = packed record
    ArcName: packed array[0..Pred(260)] of Char;
    FileName: packed array[0..Pred(260)] of Char;
    Flags: UINT;
    PackSize: UINT;
    UnpSize: UINT;
    HostOS: UINT;
    FileCRC: UINT;
    FileTime: UINT;
    UnpVer: UINT;
    Method: UINT;
    FileAttr: UINT;
    CmtBuf: PChar;
    CmtBufSize: UINT;
    CmtSize: UINT;
    CmtState: UINT;
  end;

  TRARHeaderDataEx = packed record
    ArcName: packed array [0..1023] of char;
    ArcNameW: packed array [0..1023] of WideChar;
    FileName: packed array [0..1023] of char;
    FileNameW: packed array [0..1023] of WideChar;
    Flags: UINT;
    PackSize: UINT;
    PackSizeHigh: UINT;
    UnpSize: UINT;
    UnpSizeHigh: UINT;
    HostOS: UINT;
    FileCRC: UINT;
    FileTime: UINT;
    UnpVer: UINT;
    Method: UINT;
    FileAttr: UINT;
    CmtBuf: PChar;
    CmtBufSize: UINT;
    CmtSize: UINT;
    CmtState: UINT;
    Reserved: packed array [0..1023] of UINT;
  end;

  TRAROpenArchiveData = packed record
    ArcName: PChar;
    OpenMode: UINT;
    OpenResult: UINT;
    CmtBuf: PChar;
    CmtBufSize: UINT;
    CmtSize: UINT;
    CmtState: UINT;
  end;

  TRAROpenArchiveDataEx = packed record
    ArcName: PChar;
    ArcNameW: PWideChar;
    OpenMode: UINT;
    OpenResult: UINT;
    CmtBuf: PChar;
    CmtBufSize: UINT;
    CmtSize: UINT;
    CmtState: UINT;
    Flags: UINT;
    Reserved: packed array [0..31] of UINT;
  end;

  TUnrarCallback = function (Msg: UINT; UserData, P1, P2: Integer) :Integer; stdcall;

  TRAROpenArchive = function (var ArchiveData: TRAROpenArchiveData): THandle; stdcall;
  TRAROpenARchiveEx = function (var ArchiveData: TRAROpenArchiveDataEx): THandle; stdcall;
  TRARCloseArchive = function (hArcData: THandle): Integer; stdcall;
  TRARReadHeader = function (hArcData: THandle; var HeaderData: TRARHeaderData): Integer; stdcall;
  TRARReadHeaderEx = function (hArcData: THandle; var HeaderData: TRARHeaderDataEx): Integer; stdcall;
  TRARProcessFile = function (hArcData: THandle; Operation: Integer; DestPath, DestName: PChar): Integer; stdcall;
  TRARSetCallback = procedure (hArcData: THandle; UnrarCallback: TUnrarCallback; UserData:Integer); stdcall;
  TRARSetPassword = procedure (hArcData: THandle; Password: PChar); stdcall;
  TRARGetDllVersion = function: integer; stdcall;


// Wrapper for DLL's function - old unrar.dll doesn't export RARGetDllVersion
// Returns: -1 = DLL not found; 0 = old ver. (C-style callbacks); >0 = new ver.
function RARDllGetVersion: integer;

// Dynamic loading of DLL
function UnrarDllLoad(const dllfilename : string) : Boolean;

procedure UnrarDllUnload;


  var
  UnrarDllHandle : THandle;
  RAROpenArchive : TRAROpenArchive;
  RAROpenArchiveEx : TRAROpenArchiveEx;
  RARCloseArchive : TRARCloseArchive;
  RARReadHeader : TRARReadHeader;
  RARReadHeaderEx : TRARReadHeaderEx;
  RARProcessFile : TRARProcessFile;
  RARSetPassword : TRARSetPassword;
  RARSetCallback : TRARSetCallback;



implementation

 var
  RARGetDllVersion : TRARGetDllVersion;

//////////////////////////////////////////////////////////////////////

function RARDllGetVersion: integer;
begin
 { if @RARGetDllVersion=nil then
    Result:= 0
  else
    Result:= RARGetDllVersion;          }

end;

//////////////////////////////////////////////////////////////////////

// Return: True = success
function UnrarDllLoad(const dllfilename : string) : Boolean;
var
  r : Boolean;
begin
  r:=False;
  try
    UnrarDllHandle := LoadLibrary(PChar(dllfilename));
    if UnrarDllHandle <> 0 then
    begin
      @RAROpenArchive := GetProcAddress(UnrarDllHandle, 'RAROpenArchive');
      @RAROpenArchiveEx := GetProcAddress(UnrarDllHandle, 'RAROpenArchiveEx');
      @RARCloseArchive := GetProcAddress(UnrarDllHandle, 'RARCloseArchive');
      @RARReadHeader := GetProcAddress(UnrarDllHandle, 'RARReadHeader');
      @RARReadHeaderEx := GetProcAddress(UnrarDllHandle, 'RARReadHeaderEx');
      @RARProcessFile := GetProcAddress(UnrarDllHandle, 'RARProcessFile');
      @RARSetPassword := GetProcAddress(UnrarDllHandle, 'RARSetPassword');
      @RARSetCallback := GetProcAddress(UnrarDllHandle, 'RARSetCallback');
      @RARGetDllVersion := 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
        r:=True;
    end;
  except
  end;
  Result:=r;
end;

//////////////////////////////////////////////////////////////////////

procedure UnrarDllUnload;
begin
  if UnrarDllHandle <> 0 then
    FreeLibrary(UnrarDllHandle);
end;



initialization
  {$I unrar.lrs}

end.
P.S. Das wegkommentirte funktionirt nicht.
Hier ist immernoch der Fehler mit den @
ACHTUNG: ICH VERWENDE LAZARUS

Geändert von mkinzler (15. Jul 2010 um 21:25 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.874 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Rar Dll

  Alt 15. Jul 2010, 21:26
Wenn ich dir sage, du sollst den richtigen Code-Tag nehmen, dann meine ich es so!
Und das mit dem Pushen, war auch kein Scherz!
Markus Kinzler
  Mit Zitat antworten Zitat
1234567890987654321

Registriert seit: 8. Jun 2010
73 Beiträge
 
#8

AW: Rar Dll

  Alt 15. Jul 2010, 21:37
Das mit dem Code-Tag habe ich aber nicht verstanden, wo muss das hin.
Und jetzt an alle:
Entschuldigung wegen dem push
ACHTUNG: ICH VERWENDE LAZARUS
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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;
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#10

AW: Rar Dll

  Alt 15. Jul 2010, 09:24
Lazarus kommt mit den @ nicht klar:
unit1.pas(168,14) Error: Incompatible types: got "<procedure variable type of function:LongInt;StdCall>" expected "LongInt"
unit1.pas(183,7) Error: Can't assign values to an address
unit1.pas(184,7) Error: Can't assign values to an address
unit1.pas(185,7) Error: Can't assign values to an address
unit1.pas(186,7) Error: Can't assign values to an address
unit1.pas(187,7) Error: Can't assign values to an address
unit1.pas(188,7) Error: Can't assign values to an address
unit1.pas(189,7) Error: Can't assign values to an address
unit1.pas(190,7) Error: Can't assign values to an address
unit1.pas(191,7) Error: Can't assign values to an address
unit1.pas(219,31) Error: Incompatible types: got "Constant String" expected "TRAROpenArchiveData"
unit1.pas(228) Fatal: There were 13 errors compiling module, stopping
Und was passiert wenn du die @ weg lässt?
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 +1. Es ist jetzt 17:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz