Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Rar Dll (https://www.delphipraxis.net/152970-rar-dll.html)

gsh 15. Jul 2010 09:24

AW: Rar Dll
 
Zitat:

Zitat von 1234567890987654321 (Beitrag 1035399)
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?

1234567890987654321 15. Jul 2010 09:28

AW: Rar Dll
 
Dannkomen die Fehler:
unrar.pas(149,10) Warning: Function result does not seem to be set
unrar.pas(169,29) Error: Incompatible types: got "Pointer" expected "<procedure variable type of function(var TRAROpenArchiveData):DWord;StdCall>"
unrar.pas(170,29) Error: Incompatible types: got "Pointer" expected "<procedure variable type of function(var TRAROpenArchiveDataEx):DWord;StdCall>"
unrar.pas(171,29) Error: Incompatible types: got "Pointer" expected "<procedure variable type of function(LongWord):LongInt;StdCall>"
unrar.pas(172,29) Error: Incompatible types: got "Pointer" expected "<procedure variable type of function(LongWord,var TRARHeaderData):LongInt;StdCall>"
unrar.pas(173,29) Error: Incompatible types: got "Pointer" expected "<procedure variable type of function(LongWord,var TRARHeaderDataEx):LongInt;StdCall>"
unrar.pas(174,29) Error: Incompatible types: got "Pointer" expected "<procedure variable type of function(LongWord, LongInt, PChar, PChar):LongInt;StdCall>"
unrar.pas(175,29) Error: Incompatible types: got "Pointer" expected "<procedure variable type of procedure(LongWord, PChar);StdCall>"
unrar.pas(176,29) Error: Incompatible types: got "Pointer" expected "<procedure variable type of procedure(LongWord, TUnrarCallback, LongInt);StdCall>"
unrar.pas(177,29) Error: Incompatible types: got "Pointer" expected "<procedure variable type of function:LongInt;StdCall>"
unrar.pas(206) Fatal: There were 9 errors compiling module, stopping

1234567890987654321 15. Jul 2010 10:06

AW: Rar Dll
 
Weis keiner eine Antwort?:(:(:(

mkinzler 15. Jul 2010 11:32

AW: Rar Dll
 
Eigentlich sollte man nicht innerhalb von 24 Stunden Pushen.

1234567890987654321 15. Jul 2010 11:45

AW: Rar Dll
 
Die Antwort hats ja jetzt gebracht...

Mithrandir 15. Jul 2010 12:27

AW: Rar Dll
 
Das war keine Antwort, sondern ein Hinweis an dich, sich hier an die Spielregeln zu halten. :warn: :dp:

1234567890987654321 15. Jul 2010 16:38

AW: Rar Dll
 
OK, dann bis moergen um 13 uhr:-D

himitsu 15. Jul 2010 17:08

AW: Rar Dll
 
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

1234567890987654321 15. Jul 2010 21:01

AW: Rar Dll
 
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 @

mkinzler 15. Jul 2010 21:26

AW: Rar Dll
 
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!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 Uhr.
Seite 2 von 4     12 34      

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