Gustav Brock
gustav at cactus.dk
Sun May 30 15:06:50 CDT 2004
Hi Jim and John Thanks! I was browsing to locate some code to create a cab file - then I stumbled over IExpress - it must be one of those strange MS secrets. Nevertheless, I managed too to cook a function to create a cab file using COM and no shelling in Windows 2000+. This, too, is a well preserved secret ... you have to use a strange typelib package, catsrvut.dll, which contains seven typelibs from which one is capable of compressing files to a cab file. Who would have believed that? Basically, with this type library it's three lines of code - it couldn't be simpler! However, a bit more is needed for making it as robust as needed for real life. Below is the function for creating a cab file with a single file; I'll leave it as an exercise to expand it with an array or collection of files to be stuffed in the cabinet (hint: look up the links in the comments) as this can be solved in many ways and is highly dependant on what you wish to use the function for. It uses late binding which I think is fine as the library is loaded very fast and, to be honest, I couldn't find out how to create early binding for this strange typelib - I have the feeling that it may not even be possible and as late binding works fine, I left it. Also note the parenthesis around the file name variables; they are absolutely needed for some reason. Have fun! /gustav <code> Public Function CreateCab1( _ ByVal strCabFileName As String, _ ByVal strFileNameToCab As String, _ ByVal strFileNameInCab As String) _ As Boolean ' Create Cab(inet) file containing one compressed file ' by using the typelib in catsrvut.dll. ' OS must be Windows 2000+. ' 2004-05-30. Cactus Data ApS, CPH. ' ' Based on code from Torgeir Bakken and Alex Angelopoulos: ' http://groups.google.com/groups?q=catsrvut.dll&start=10&hl=da&lr=&ie=UTF-8&selm=%23mxGK5hiCHA.1328%40tkmsftngp09&rnum=11 ' http://groups.google.com/groups?q=catsrvut.dll&hl=da&lr=&ie=UTF-8&selm=Oqs%24H3ioCHA.1636%40TK2MSFTNGP09&rnum=2 ' http://x220.win2ktest.com/forum/topic.asp?TOPIC_ID=3318 ' Settings for properties of created Cab file. Const cbooMakeSignable As Boolean = False Const cbooExtraSpace As Boolean = False Const cbooUse10Format As Boolean = False ' Error code for wrong number of arguments. Const clngErrArguments As Long = 450 Dim objCab As Object Dim booSuccess As Boolean On Error Resume Next If Len(strCabFileName) = 0 Or Len(strFileNameToCab) = 0 Then ' Nothing to do. Exit Function End If ' Create Cabinet object from COMEXPLib.ComExport typelib. Set objCab = CreateObject("MakeCab.MakeCab.1") If Err.Number = 0 Then ' Object could be created. If Len(strFileNameInCab) = 0 Then ' No specific name for the file in the cabinet has been given. ' Use the name of the source file. ' Note: Path will be preserved. strFileNameInCab = strFileNameToCab End If With objCab ' Parameters for method CreateCab. ' Except for the first, all parameters _must_ be of type Boolean. ' For Windows 2000: ' CreateCab ByVal CabFileName, ByVal MakeSignable, ByVal ExtraSpace ' For Windows XP/2003: ' CreateCab ByVal CabFileName, ByVal MakeSignable, ByVal ExtraSpace, ByVal Use10Format ' ' Try call for Windows 2000. .CreateCab (strCabFileName), cbooMakeSignable, cbooExtraSpace If Err.Number = clngErrArguments Then ' Call for Windows 2000 failed. ' Reset error and try call for Windows XP. Err.Clear .CreateCab (strCabFileName), cbooMakeSignable, cbooExtraSpace, cbooUse10Format End If If Err.Number = 0 Then ' Cab file has been initialized. ' Add the file to the cabinet and close. .AddFile (strFileNameToCab), (strFileNameInCab) .CloseCab If Err.Number = 0 Then ' The file was added successfully to the cabinet. booSuccess = True End If End If End With End If Set objCab = Nothing ' Return True if success. CreateCab1 = booSuccess End Function </code>