cab10.dll Cabarchive erstellen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

cab10.dll Cabarchive erstellen

Beitrag 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

  
Zuletzt geändert von X0r am 03.07.2007 22:36, insgesamt 1-mal geändert.
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
Zuletzt geändert von ts-soft am 03.07.2007 22:19, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Beitrag 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:
BildBildBildBild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag von Green Snake »

Forge hat doch einen Link zur DLL gepostet....
-.-"
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

Und damit niemand suchen muss, hier noch schnell der link zu den DOCs. :wink:

http://oregonstate.edu/~reeset/html/other/cab.html
ShadowTurtle
Beiträge: 114
Registriert: 11.09.2004 07:58
Wohnort: Mannheim
Kontaktdaten:

Beitrag von ShadowTurtle »

Witzig wäre wenn die cab10.dll selbst auf die CABINET.DLL zugreifen würde. Solche Sachen gab es schon öfters.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten