Seite 1 von 2

cab10.dll Cabarchive erstellen

Verfasst: 03.07.2007 20:25
von X0r
Da das so schön im InstallForge thread besprochen wird, dachte ich mal, ich poste das hier rein:

Download: http://oregonstate.edu/~reeset/html/oth ... /cab10.dll


Beispiel:

Code: Alles auswählen





If OpenLibrary(2,"cab10.dll") 
  CabAbout                  =GetFunction(2,"CABABOUT") 
  CabCompressInitialize     =GetFunction(2,"CABCOMPRESSINITIALIZE") 
  CabDecompressInitialize   =GetFunction(2,"CABDECOMPRESSINITIALIZE") 
  CabCreate                 =GetFunction(2,"CABCREATE") 
  CabAddFile                =GetFunction(2,"CABADDFILE") 
  CabClose                  =GetFunction(2,"CABCLOSE") 
  CabEnum                   =GetFunction(2,"CABENUM") 
  CabExtract                =GetFunction(2,"CABEXTRACT") 
  CabCompressTerminate      =GetFunction(2,"CABCOMPRESSTERMINATE") 
  CabDecompressTerminate    =GetFunction(2,"CABDECOMPRESSTERMINATE")  
  Else 
  MessageRequester("Error","Could not load cab10.dll!",#MB_ICONERROR) 
  End 
EndIf 




Procedure.s CabAbout() 

  Shared CabAbout.l 
  
  ProcedureReturn PeekS(CallFunctionFast(CabAbout)) 
  
EndProcedure 



Procedure.l CabCompressInitialize() 

  Shared CabCompressInitialize.l 
  
  ProcedureReturn CallFunctionFast(CabCompressInitialize) 
  
EndProcedure 


Procedure.l CabCreate(Destination.s) 

  Shared CabCreate.l 
  
  ProcedureReturn CallFunctionFast(CabCreate, Destination) 
  
EndProcedure 

Procedure.l CabAddFile(hCab, Source.s, Destination.s) 

  Shared CabAddFile.l 
  
  ProcedureReturn CallFunctionFast(CabAddFile, hCab, Source, Destination) 
  
EndProcedure 

Procedure.l CabClose(hCab.l) 

  Shared CabClose.l 
  
  ProcedureReturn CallFunctionFast(CabClose, hCab) 
  
EndProcedure 


Procedure.l CabCompressTerminate() 

  Shared CabCompressTerminate.l 
  
  ProcedureReturn CallFunctionFast(CabCompressTerminate)  
  
EndProcedure 


CabFileName.s="C:/cabinet.cab"
File.s="C:/data.dat"

  If CabCompressInitialize()
    CabFile = CabCreate(CabFileName)
    If CabFile
 
      CabAddFile(CabFile, File,File)
      CabClose(CabFile)
     EndIf
      CabCompressTerminate()
   EndIf

  

Verfasst: 03.07.2007 21:03
von Thorsten1867
Scheint Freeware zu sein, womit einer Nutzung nichts im Weg stehen sollte:
Disclaimer: Die Software wird kostenlos, in gutem Zustand, so wie sie ist, vom Autor Terry Reese angeboten. Die Benutzung erfolgt auf eigene Gefahr. Durch das Herunterladen und/oder die Benutzung beeinhaltet, dass sie zustimmen, den Autor von allen Effekten und Nebeneffekten zu verschonen.

Verfasst: 03.07.2007 21:20
von ts-soft
Das Beispiel mal in der empfohlenen PB4 Syntax, erspart auch Overhead
durch Proceduren:

Code: Alles auswählen

Prototype.l CabCompressInitialize()
Prototype.l CabCreate(Destination.s)
Prototype.l CabAddFile(hCab.l, Source.s, Destination.s)
Prototype.l CabClose(CabFile.s, hCab.l)
Prototype.l CabCompressTerminate()

Define.l cab10dll = OpenLibrary(#PB_Any, "cab10.dll")
If cab10dll
  Global CabCompressInitialize.CabCompressInitialize  = GetFunction(cab10dll, "CABCOMPRESSINITIALIZE")
  Global CabCreate.CabCreate                          = GetFunction(cab10dll, "CABCREATE")
  Global CabAddFile.CabAddFile                        = GetFunction(cab10dll, "CABADDFILE")
  Global CabClose.CabClose                            = GetFunction(cab10dll, "CABCLOSE")
  Global CabCompressTerminate.CabCompressTerminate    = GetFunction(cab10dll, "CABCOMPRESSTERMINATE")
Else
  MessageRequester("Error", "Could not load cab10.dll!", #MB_ICONERROR)
  End
EndIf

Define.l CabFile
Define.s File, CabFileName = "C:\data.cab"

If CabCompressInitialize()
  CabFile = CabCreate(CabFileName)
  If CabFile
    File.s = "C:/data.dat"
    CabAddFile(CabFile, File, File)
    CabClose(CabFileName, CabFile)
  EndIf
  CabCompressTerminate()
EndIf
Ungetestet, da ich die DLL gerade nicht zur Hand habe.

Gruß
Thomas

Verfasst: 03.07.2007 21:56
von Programie
ts-soft hat geschrieben:Das Beispiel mal in der empfohlenen PB4 Syntax, erspart auch Overhead
durch Proceduren:

Code: Alles auswählen

Prototype.l CabCompressInitialize()
Prototype.l CabCreate(Destination.s)
Prototype.l CabAddFile(hCab.l, Source.s, Destination.s)
Prototype.l CabClose(hCab.l)
Prototype.l CabCompressTerminate()

Define.l cab10dll = OpenLibrary(#PB_Any, "cab10.dll")
If cab10dll
  Global CabCompressInitialize.CabCompressInitialize  = GetFunction(cab10dll, "CABCOMPRESSINITIALIZE")
  Global CabCreate.CabCreate                          = GetFunction(cab10dll, "CABCREATE")
  Global CabAddFile.CabAddFile                        = GetFunction(cab10dll, "CABADDFILE")
  Global CabClose.CabClose                            = GetFunction(cab10dll, "CABCLOSE")
  Global CabCompressTerminate.CabCompressTerminate    = GetFunction(cab10dll, "CABCOMPRESSTERMINATE")
Else
  MessageRequester("Error", "Could not load cab10.dll!", #MB_ICONERROR)
  End
EndIf

Define.l CabFile
Define.s File, CabFileName = "C:\data.cab"

If CabCompressInitialize()
  CabFile = CabCreate(CabFileName)
  If CabFile
    File.s = "C:/data.dat"
    CabAddFile(CabFile, File, File)
    CabClose(CabFile)
  EndIf
  CabCompressTerminate()
EndIf
Ungetestet, da ich die DLL gerade nicht zur Hand habe.

Gruß
Thomas
Da kommt eine Fehlermeldung bei "CabClose(CabFile)" mit "Invalid Memory Access".
Das Beispiel von Forge funktioniert! :allright:

Verfasst: 03.07.2007 22:21
von ts-soft
Programie hat geschrieben: Da kommt eine Fehlermeldung bei "CabClose(CabFile)" mit "Invalid Memory Access".
Das Beispiel von Forge funktioniert! :allright:
Habs mal korrigiert, hab bei Forge seine nicht deklarierten Shared Variablen
nicht aufgepaßt. (solche undeklarierten Codes passen IMHO nicht her)
Ohne DLL kann ich leider auch nicht testen, sry

Verfasst: 03.07.2007 22:58
von Green Snake
Forge hat doch einen Link zur DLL gepostet....

Verfasst: 03.07.2007 23:05
von ts-soft
Green Snake hat geschrieben:Forge hat doch einen Link zur DLL gepostet....
Ist das ein Grund, wenn ich die nicht brauche, Windows entihält bereits alles
um Cab-Dateien zu erstellen, bzw. extrahieren.
Ausserdem würde ich dann Prototypes für alle Funktionen erstellen, wie es
eigentlich sein sollte, dazu hab ich aber keine Lust, da die DLL für mich
Unnütz ist. Die API der in Windows vorhandenen "CABINET.DLL" reicht mir :mrgreen:

Verfasst: 08.07.2007 00:16
von al90
Und damit niemand suchen muss, hier noch schnell der link zu den DOCs. :wink:

http://oregonstate.edu/~reeset/html/other/cab.html

Verfasst: 08.07.2007 11:19
von ShadowTurtle
Witzig wäre wenn die cab10.dll selbst auf die CABINET.DLL zugreifen würde. Solche Sachen gab es schon öfters.

Verfasst: 08.07.2007 11:24
von Kaeru Gaman
kann man den befehlsumfang der CABINET.DLL auf der MSDN einsehen?

müßte dann doch mit underscore aufrufbar sein, wie alle anderen API-calls auch, oder?


...wäre vielleicht mal ne maßnahme, wenn einer dazu ein "HowTo" schreibt,
anstatt nen importer für ne extra-dll die man noch runterladen muss...