PDA

View Full Version : How to get exit code from CABARC.EXE?


a_t_jackson
09-09-2003, 06:30 AM
I'm using CABARC.EXE to package an ActiveX control into a CAB file. I've created a "Run Program" action in Vis Build and have been able to get it working properly with this syntax:

%DOSCMD% cabarc -s 6144 n MyApp.cab MyApp.inf MyApp.ocx

However, I also want to handle cases where something goes wrong. For example, if the file "MyApp.inf" doesn't exist the console window will actually show:

FCIAddFile() failed: code 1 [Failure opening file to be stored in cabinet]

but Vis Build doesn't pick up the error and reports that the action completed successfully. I've got "Success exit Codes = 0". Any ideas?

kinook
09-09-2003, 07:21 AM
Unfortunately, cabarc.exe doesn't return a non-zero exitcode in most error situations. You would need to parse the program output for error strings and fail the build if any are found. Here is one way it could be done (you can copy and paste the text below into VisBuildPro; it assumes VBScript is set as your default script language; the script code is accessed within VBP by clicking the Script Editor button within the step properties dialog and switching to the Step tab):


<step action='Run Program' type='0'>
<command>cabarc -s 6144 n %TEMP%\MyApp.cab c:\nonexist.ini</command>
<name>call cabarc</name>
<outputfrom type='3'>1</outputfrom>
<script><![CDATA[
Function vbld_StepDone()
' look for the string ' failed' in the cabarc output and fail the build if found
If InStr(Application.Macros(vbldMacroSystem)("LASTSTEP_OUTPUT"), " failed") <> 0 Then _
Err.Raise 1, Step.Name, "cabarc utility failed"
End Function
]]></script>
</step>

a_t_jackson
09-10-2003, 04:23 AM
Thanks for your help. I've finally got it to work by realising that the XML tags weren't requried and just including this section of your code in the STEP tab:

Function vbld_StepDone()
' look for the string ' failed' in the cabarc output and fail the build if found
If InStr(Application.Macros(vbldMacroSystem)("LASTSTEP_OUTPUT"), " failed") <> 0 Then _
Err.Raise 1, Step.Name, "cabarc utility failed"
End Function

One more problem...calling Err.Raise just seems to stop the Build without triggering my Failiure steps. Any ideas?

kinook
09-11-2003, 11:21 AM
You can copy and paste XML step text into the step grid (not the step properties dialog) and it will create a new step with all the properties initialized.

There is currently a bug in that failure steps are not built when a failure occurs within a step's script event. As a workaround, you could instead place the script code a Run Script step following the cabarc step:

<step action='Run Script' type='0'>
<Language>VBScript</Language>
<Script><![CDATA[' look for the string ' failed' in the cabarc output and fail the build if found
If InStr(Application.Macros(vbldMacroSystem)("LASTSTEP_OUTPUT"), " failed") <> 0 Then _
Err.Raise 1, Step.Name, "cabarc utility failed"
]]></Script>
<indent type='3'>1</indent>
<name>test failure</name>
</step>