I suspect that the reason that the directory is not yet created is that Windows Installer hasn't actually started executing the script yet.
When executing the InstallExecuteSequence, for standard actions and deferred custom actions sequenced after InstallInitialize, Windows Installer doesn't actually perform these actions at this point. Instead, it writes the actions that are to be performed into a script. If I recall correctly, this is still happpening under the process that began processing the package, under the user's credentials. However, non-deferred actions are executed immediately. When the InstallFinalize action is executed, it passes the script over to the Windows Installer service, which actually performs the actions recorded in the script (including calling deferred custom actions, in the order they were sequenced). (There are also InstallExecute and InstallExecuteAgain actions which I believe can be used to run the pending script up to the point that these actions are scheduled, then begin a new script). CreateShortcuts is probably scheduled between InstallInitialize and InstallFinalize (in fact it should be). Therefore it's in the script-writing execution phase and so your action is too. The action that would create the directory (probably InstallFiles but might be CreateFolders) haven't actually been performed yet. To fix, make your custom action deferred, move it after InstallFinalize, or make use of InstallExecute[Again] to interrupt the deferred script execution. I can only assume that it works on XP either because the folder already exists or that somehow that operating system is creating the whole path to the folder. -- Mike Dimmick -----Original Message----- From: Julie Campbell [mailto:[EMAIL PROTECTED] Sent: 24 April 2007 21:28 To: 'Mike Dimmick'; wix-users@lists.sourceforge.net Subject: RE: [WiX-users] Custom Action works under WinXP-SP2,fails under Win2K? No, cchIniName is initialized, I was just saving everyone an extra chunk of code that is working. Here is the function that initializes cchIniName and the other WiX property strings before the call to fopen_s: // NOTE: Caller responsible for freeing TCHAR * buffer if non-null return code TCHAR * __stdcall privMsiGetPropertyStr(MSIHANDLE hInstaller, TCHAR *strName) { TCHAR* szValueBuf = NULL; DWORD cchValueBuf = 0; UINT uiStat = ::MsiGetProperty(hInstaller, strName, TEXT(""), &cchValueBuf); if (ERROR_MORE_DATA == uiStat) { ++cchValueBuf; // output count does not include terminating null, so add 1 szValueBuf = new TCHAR[cchValueBuf]; if (szValueBuf) { uiStat = MsiGetProperty(hInstaller, strName, szValueBuf, &cchValueBuf); } } if (ERROR_SUCCESS != uiStat) { if (szValueBuf != NULL) delete [] szValueBuf; return NULL; } return szValueBuf; } --- I copied that chunk of code from somewhere, excuse the poor use of Hungarian notation. If you look at what I am writing to this ".ini" file, you will notice that it has nothing to do with what a <IniFile> deal with. This is a .ini file that supplies java startup variable to Eclipse (actually, our customized version of Eclipse). Eclipse is very touchy and I am afraid to try a unicode file since it works with a text file. Heck, I wouldn't need this CA at all if Eclipse could figure out %WINDIR% in a path, but it can't. As I mentioned, this works GREAT under XP. Though this CA was quickly hacked together and leaves room for improvement, there is nothing intrinsically wrong with the CA code. It does what it is supposed to as long as the directory it is trying to write to exists before it tries to write the file to it. There is something wrong with the .msi sequencing that is baffling me, as that directory should exist long before it tries to execute my custom action. Julie Campbell [EMAIL PROTECTED] -----Original Message----- From: Mike Dimmick [mailto:[EMAIL PROTECTED] Sent: Tuesday, April 24, 2007 4:17 PM To: 'Julie Campbell'; wix-users@lists.sourceforge.net Subject: RE: [WiX-users] Custom Action works under WinXP-SP2,fails under Win2K? Your call to fopen_s uses the uninitialised cchIniName buffer as the path name to open for writing. (BTW, misuse of Hungarian notation because this is _not_ a Count of Characters - use sz or psz for string-terminated-with-zero. If that's what you intended, of course.) You can also edit INI files using the <IniFile> element which maps to a native Windows Installer feature. The type of the Value field is Formatted, so you should be able to substitute property values using [] within the field data. -- Mike Dimmick -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Julie Campbell Sent: 24 April 2007 21:09 To: 'Mike Dimmick'; wix-users@lists.sourceforge.net Subject: Re: [WiX-users] Custom Action works under WinXP-SP2,fails under Win2K? fprintf writes to the file pointed to by cchIniName. Julie Campbell [EMAIL PROTECTED] -----Original Message----- From: Mike Dimmick [mailto:[EMAIL PROTECTED] Sent: Tuesday, April 24, 2007 4:05 PM To: 'Julie Campbell'; wix-users@lists.sourceforge.net Subject: RE: [WiX-users] Custom Action works under WinXP-SP2, fails under Win2K? Did you miss a line out? You don't appear to have written to the buffer pointed to by cchIniName so it will be filled with garbage. The success or failure may depend on whether the junk in the buffer parses as a valid file name or not. I would strongly recommend using Unicode file name buffers and therefore _wfopen_s if you're targetting Windows NT-based operating systems only and not supporting Windows 9X. -- Mike Dimmick -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Julie Campbell Sent: 24 April 2007 20:43 To: wix-users@lists.sourceforge.net Subject: [WiX-users] Custom Action works under WinXP-SP2, fails under Win2K? My installer needs to work under WinXP and Win2K for this round. I wrote a custom action and it works great under WinXP but fails under Win2K and I cannot figure out why. I am using WiX v3.0.2420, both machines have Windows R Installer. V 3.01.4000.1823 installed. The custom action is in a C++ DLL, here is the action function: UINT __stdcall WriteTSBIni(MSIHANDLE hInstaller) { UINT rc = ERROR_SUCCESS; USES_CONVERSION; // Get the installation directory name TCHAR *cchWindowsFolder = privMsiGetPropertyStr(hInstaller, TEXT("WindowsFolder")); TCHAR *cchInstallDir = privMsiGetPropertyStr(hInstaller, TEXT("INSTALLDIR")); TCHAR *cchIviDir = privMsiGetPropertyStr(hInstaller, TEXT("IVIDIRPROP")); if (cchIviDir) { if (cchWindowsFolder) { if (cchInstallDir) { size_t szBuf = strlen(W2CA(cchInstallDir)) + strlen ("Test Script Builder\\TestScriptBuilder.ini") + 1; char *cchIniName = new char[szBuf]; FILE *fIni; if (errno_t err = fopen_s(&fIni, cchIniName, "w")) { sprintf_s(cchIniName, szBuf, "err=%d", err); return ERROR_INSTALL_FAILURE; } else { fprintf (fIni, "-vmargs\r\n"); fprintf (fIni, "-Djava.lang.path=.;"); fprintf (fIni, "%s.;", W2A(cchIviDir)); fprintf (fIni, "%s.;", W2A(cchWindowsFolder)); fprintf (fIni, "%sSystem32\\.;\r\n", W2A(cchWindowsFolder)); fclose (fIni); } delete[] cchIniName; delete[] cchInstallDir; } delete[] cchWindowsFolder; } delete[] cchIviDir } return ERROR_SUCCESS; } --- The .wxs source snippet is: <CustomAction Id="CAKE_WRITE_TSB_INI" BinaryKey="CAKE_ACTIONS" DllEntry="WriteTSBIni" Return="check" /> <InstallExecuteSequence> <Custom Action="CAKE_WRITE_TSB_INI" After='CreateShortcuts'>NOT Installed</Custom> </InstallExecuteSequence> --- I ran with the /la switch and got the same sequence on both machines, until after the CAKE_WRITE_TSB_INI action. I checked the sequencing with Orca, CAKE_WRITE_TSB_INI is in the InstallExecuteSequence table at #4501, right after CreateShortcuts as expected. The fopen_s error that I get under Win2K indicates the folder doesn't exist (2). I used message boxes to pause the custom action and checked, and despite being past that point in the log file and sequence, the directory indeed was non-existent. I have no idea what to try next or why this is behaving differently. Help? Julie Campbell [EMAIL PROTECTED] ____________________________________________________________________________ _ Scanned by IBM Email Security Management Services powered by MessageLabs. For more information please visit http://www.ers.ibm.com ____________________________________________________________________________ _ ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ WiX-users mailing list WiX-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wix-users ____________________________________________________________________________ _ Scanned by IBM Email Security Management Services powered by MessageLabs. For more information please visit http://www.ers.ibm.com ____________________________________________________________________________ _ ____________________________________________________________________________ _ Scanned by IBM Email Security Management Services powered by MessageLabs. For more information please visit http://www.ers.ibm.com ____________________________________________________________________________ _ ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ WiX-users mailing list WiX-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wix-users ____________________________________________________________________________ _ Scanned by IBM Email Security Management Services powered by MessageLabs. For more information please visit http://www.ers.ibm.com ____________________________________________________________________________ _ ____________________________________________________________________________ _ Scanned by IBM Email Security Management Services powered by MessageLabs. For more information please visit http://www.ers.ibm.com ____________________________________________________________________________ _ ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ WiX-users mailing list WiX-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wix-users