Hi Michael, Thanks again for the explanation.
Could you also tell me please what are the following lines of code actually do?: <DirectoryRef Id="INSTALLDIR"> <Directory Id="MyApp.Binaries" /> </DirectoryRef> Thanks! MeCoco On 3/9/2011 3:08 PM, Michael Urman wrote: > That doesn't look like it creates a component whose Directory is > INSTALLDIR. It may put the component's file in the same directory, but > since custom actions could override this, it doesn't count. What you > need is the Directory_ column of the Component table to say INSTALLDIR > instead of MyApp.Binaries, for at least one installed component. > > On Wed, Mar 9, 2011 at 02:29, MeCoco<vcotirl...@hotmail.com> wrote: >> Hi Michael, >> >> Thanks for your answer. >> >> Is the following code not enough to preserve the INSTALLDIR directory? >> >> <Fragment> >> <DirectoryRef Id="INSTALLDIR"> >> <Directory Id="MyApp.Binaries" /> >> </DirectoryRef> >> </Fragment> >> >> <Fragment> >> <Component Id="MyApp.Binaries.app.config" Directory="MyApp.Binaries" >> Guid="MY-GUID"> >> <File Id="MyApp.Binaries.app.config" Source="MyApp.app.config" /> >> </Component> >> </Fragment> >> >> As the file MyApp.app.config ends up going into the INSTALLLOCATION >> directory? >> >> >> I am not even sure what the: >> <Fragment> >> <DirectoryRef Id="INSTALLDIR"> >> <Directory Id="MyApp.Binaries" /> >> </DirectoryRef> >> </Fragment> >> >> is doing as the: >> >> <Directory Id="MyApp.Binaries" /> >> >> doesn't have any Name parameter, so it looks like redefining >> MyApp.Binaries to be the INSTALLDIR value. Am I assuming correct? >> >> >> Thanks, >> MeCoco >> >> On 3/8/2011 3:07 PM, Michael Urman wrote: >>> Directories are only automatically preserved when there is a component >>> that installs to it. So make sure at least one component installs to >>> INSTALLDIR. >>> >>> On Tue, Mar 8, 2011 at 03:31, MeCoco<vcotirl...@hotmail.com> wrote: >>>> Hi all, >>>> >>>> I tried to create a small sample to reproduce the problem I'm having, >>>> and after a lot of tries I managed to reproduce it. The problem is >>>> described extensivly in my previous email, but a summary would be: if >>>> the user, when installing, changes the default directory (eg: from >>>> C:\Program Files\... to Z:\Program Files\...), then on uninstall (only >>>> real uninstall, not updates) one can see in the verbose log file that >>>> the INSTALLDIR property is set wrong to the default value (eg: >>>> C:\Program Files\...) and not to the folder where the user really >>>> installed the product (eg: Z:\Program Files\...) >>>> >>>> HOW to reproduce the problem: >>>> >>>> 1) If in the code I have the following: >>>> >>>> <Directory Id="TARGETDIR" Name="SourceDir"> >>>> <Directory Id="ProgramFilesFolder"> >>>> <Directory Id="INSTALLDIR" Name="$(var.InstallDirectoryName)"> >>>> >>>> <Component Id="MyDoc.txt" Guid="6817A42D-30E7-464C-99DC-8FDBED6D70C6"> >>>> <File Id="MyDoc.txt" Source="MyDoc.txt" KeyPath="yes" Checksum="yes" /> >>>> </Component> >>>> >>>> <Directory Id="Modules" Name="Modules"> >>>> >>>> <Component Id="MyLogo.txt" Guid="68C1561C-85F8-4E2F-81F4-41DDDBE35DDB"> >>>> <File Id="MyLogo.txt" Source="MyLogo.txt" KeyPath="yes" Checksum="yes" /> >>>> </Component> >>>> >>>> </Directory> >>>> </Directory> >>>> </Directory> >>>> </Directory> >>>> >>>> >>>> <!-- application features --> >>>> <Feature Id="Application" Title="$(var.ProductName) Application" >>>> Level="1" Absent="disallow"> >>>> <ComponentRef Id="MyLogo.txt" /> >>>> <ComponentRef Id="MyDoc.txt" /> >>>> </Feature> >>>> >>>> I get everything correct, meaning I have in the log file the following: >>>> MSI (s) (08:24) [10:13:46:801]: PROPERTY CHANGE: Adding INSTALLDIR >>>> property. Its value is 'Z:\Program Files\MyTestInstallDirectory'. >>>> MSI (s) (08:24) [10:13:46:801]: PROPERTY CHANGE: Adding Modules >>>> property. Its value is 'Z:\Program Files\MyTestInstallDirectory\Modules'. >>>> >>>> >>>> 2) BUT, if in the code the MyDoc.txt component is missing, the >>>> INSTALLDIR property is wrong. So, for the code: >>>> >>>> <Directory Id="TARGETDIR" Name="SourceDir"> >>>> <Directory Id="ProgramFilesFolder"> >>>> <Directory Id="INSTALLDIR" Name="$(var.InstallDirectoryName)"> >>>> >>>> <Directory Id="Modules" Name="Modules"> >>>> >>>> <Component Id="MyLogo.txt" Guid="68C1561C-85F8-4E2F-81F4-41DDDBE35DDB"> >>>> <File Id="MyLogo.txt" Source="MyLogo.txt" KeyPath="yes" Checksum="yes" /> >>>> </Component> >>>> >>>> </Directory> >>>> </Directory> >>>> </Directory> >>>> </Directory> >>>> >>>> >>>> <!-- application features --> >>>> <Feature Id="Application" Title="$(var.ProductName) Application" >>>> Level="1" Absent="disallow"> >>>> <ComponentRef Id="MyLogo.txt" /> >>>> </Feature> >>>> >>>> In the log file I can see: >>>> MSI (s) (08:B0) [10:16:49:444]: PROPERTY CHANGE: Adding INSTALLDIR >>>> property. Its value is 'C:\Program Files\MyTestInstallDirectory\'. >>>> MSI (s) (08:B0) [10:16:49:444]: PROPERTY CHANGE: Modifying Modules >>>> property. Its current value is 'Z:\Program >>>> Files\MyTestInstallDirectory\Modules'. Its new value: 'Z:\Program >>>> Files\MyTestInstallDirectory\Modules\'. >>>> >>>> >>>> Is this a bug or am I doing something wrong? I think in both cases the >>>> INSTALLDIR should have the correct value (Z:\Program Files\...) on >>>> uninstall. >>>> Any tip is appreciated. >>>> Thank you, >>>> MeCoco >>>> >>>> >>>> >>>> On 3/7/2011 7:24 PM, MeCoco wrote: >>>>> Hi all, >>>>> >>>>> I have a very extensive installer, written by somebody that left our >>>>> company, and I have to add a custom action that should be executed at >>>>> the end of the uninstaller (only when completely removed from control >>>>> panel, not in case of an update) in order to remove a file that was at >>>>> a later point created by our product. >>>>> >>>>> I wrote a small test-installer to do just that and everything works >>>>> fine: the custom action that should delete a specific file from the >>>>> installation directory is run at the end of the uninstallation: >>>>> >>>>> <CustomAction Id="QtExecDeferred_Cmd1" Property="QtExecDeferred1" >>>>> Value='"[SystemFolder]Cmd.exe" /C del /Q "[INSTALLLOCATION >>>>> ]MyLogo.txt"'/> >>>>> <CustomAction Id="QtExecDeferred1" BinaryKey="WixCA" >>>>> DllEntry="CAQuietExec" Execute="deferred" Return="ignore" >>>>> Impersonate="no"/> >>>>> >>>>> <InstallExecuteSequence> >>>>> <Custom Action="QtExecDeferred_Cmd1" >>>>> Before="QtExecDeferred1">REMOVE="ALL" AND NOT >>>>> UPGRADINGPRODUCTCODE</Custom> >>>>> <Custom Action="QtExecDeferred1" >>>>> After="RemoveExistingProducts">REMOVE="ALL" AND NOT >>>>> UPGRADINGPRODUCTCODE</Custom> >>>>> </InstallExecuteSequence> >>>>> >>>>> >>>>> >>>>> The problem is that when I try to integrate the exact same code into >>>>> the big installer this doesn't work anymore. The installer is a >>>>> WIXUI_INSTALLDIR. >>>>> I generated a verbose log file and I noticed that the INSTALLLOCATION >>>>> property is wrong when uninstalling the product, instead of being the >>>>> real directory where the product was installed (chosen by the user, >>>>> eg: Z:\momo) is actually the default directory (eg: C:\Program >>>>> Files\MyApp), so the file that needs to be deleted: >>>>> "[INSTALLLOCATION]MyLogo.txt" is not found because the INSTALLLOCATION >>>>> is not correct. Weird is, that only in the uninstall case, the >>>>> INSTALLLOCATION property is wrong. In case of an update it looks ok >>>>> (eg Z:\momo). As one can see in the attached log file, some paths >>>>> there are the correct ones: Z:\Program Files\... and some are the >>>>> wrong ones: C:\Program Files\... >>>>> >>>>> As the INSTALLLOCATION is correct in my small test-installer during >>>>> uninstall, it is smth in this big and extensive installer that makes >>>>> it behave differently than my test-sample. The installer has million >>>>> of files that take care to install millions of binaries and I tried to >>>>> check to see where exactly the problem is, but I was not able to find >>>>> anything useful which would explain why on uninstall the >>>>> INSTALLLOCATION is wrong. I also tried to create a small sample in >>>>> order to reproduce the problem, but also without success: in all my >>>>> samples this works ok (INSTALLLOCATION is the correct one on >>>>> uninstall). Can smbd pls point out some hints or places where I could >>>>> look? I will put below the code-snippet that is related to that and I >>>>> will attach the log file. In the log file, the default installation >>>>> path is: C:\Program Files and the path chosen by the user during >>>>> install is: Z:\Program Files. The log is a verbose log of the >>>>> uninstall. Any hint is more than welcome! >>>>> >>>>> Code snippets: >>>>> ================ >>>>> >>>>> <CustomAction Id="SetARPINSTALLLOCATION" Property="ARPINSTALLLOCATION" >>>>> Value="[INSTALLLOCATION]" /> >>>>> >>>>> <!-- Sequences --> >>>>> <InstallExecuteSequence> >>>>> <Custom Action="SetARPINSTALLLOCATION" After="InstallValidate">NOT >>>>> Installed</Custom> >>>>> </InstallExecuteSequence> >>>>> >>>>> >>>>> <Directory Id="TARGETDIR" Name="SourceDir"> >>>>> <Directory Id="ProgramFilesFolder"> >>>>> <Directory Id="INSTALLLOCATION" Name="MyInstallDir"> >>>>> <Directory Id="Modules" Name="Modules"> >>>>> >>>>> </Directory> >>>>> </Directory> >>>>> </Directory> >>>>> </Directory> >>>>> >>>>> >>>>> <CustomAction Id="QtExecDeferred_Cmd1" Property="QtExecDeferred1" >>>>> Value='"[SystemFolder]Cmd.exe" /C del /Q >>>>> "[INSTALLLOCATION]MyLogo.txt"'/> >>>>> <CustomAction Id="QtExecDeferred1" BinaryKey="WixCA" >>>>> DllEntry="CAQuietExec" Execute="deferred" Return="ignore" >>>>> Impersonate="no"/> >>>>> >>>>> >>>>> <InstallExecuteSequence> >>>>> <Custom Action="QtExecDeferred_Cmd1" >>>>> Before="QtExecDeferred1">REMOVE="ALL" AND NOT >>>>> UPGRADINGPRODUCTCODE</Custom> >>>>> <Custom Action="QtExecDeferred1" >>>>> After="RemoveExistingProducts">REMOVE="ALL" AND NOT >>>>> UPGRADINGPRODUCTCODE</Custom> >>>>> </InstallExecuteSequence> >>>>> >>>>> >>>>> <Property Id="INSTALLLOCATION"> >>>>> <RegistrySearch Id="FindInstallLocation" Root="HKLM" >>>>> Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[OLDAPPFOUND]" >>>>> Name="InstallLocation" >>>>> Type="raw" /> >>>>> </Property> >>>>> >>>>> <Upgrade Id="$(var.UpgradeCode)"> >>>>> <UpgradeVersion Property="OLDAPPFOUND" IncludeMinimum="yes" >>>>> Minimum="2.0.0.0" IncludeMaximum="no" >>>>> Maximum="!(bind.FileVersion.MyApp.Binaries.$(var.MyApp.TargetFileName))"/> >>>>> ... >>>>> </Upgrade> >>>>> >>>>> >>>>> >>>>> <!-- application features --> >>>>> <Feature Id="Application" Title="$(var.ProductName) Application" >>>>> Level="1" Absent="disallow"> >>>>> <ComponentGroupRef Id="MyApp.Binaries" /> >>>>> <ComponentGroupRef Id="_3rdParty.Binaries"/> >>>>> <ComponentGroupRef Id="MyApp.Splash.Binaries"/> >>>>> <ComponentRef Id="ApplicationShortcut"/> >>>>> </Feature> >>>>> <Feature Id="Modules" Title="$(var.ProductName) My Modules" Level="1" >>>>> TypicalDefault="install"> >>>>> <FeatureRef Id="Module.Audio" /> >>>>> <FeatureRef Id="Module.Video" /> >>>>> </Feature> >>>>> >>>>> >>>>> >>>>> <Fragment> >>>>> <Feature Id="Module.Video" Title="Webcam& Screen Capturing" >>>>> Level="1" Absent="allow" InstallDefault="followParent"> >>>>> <ComponentGroupRef Id="Video.Binaries"/> >>>>> <ComponentGroupRef Id="Video.Content"/> >>>>> </Feature> >>>>> </Fragment> >>>>> <Fragment> >>>>> <ComponentGroup Id="Video"> >>>>> <Component Id="Video.Binaries.Modules.Video.dll" >>>>> Directory="Video.Binaries" Guid="{25E366B3-95D4-459C-91BA-EDFBC2D7104D}"> >>>>> <File Id="Video.Binaries.Modules.Video.dll" >>>>> Source="$(var.Video.TargetDir)\Modules.Video.dll" /> >>>>> </Component> >>>>> <Component Id="Video.Content.Video.png" >>>>> Directory="Video.Content.Resources" >>>>> Guid="{8B99C3D5-5C84-49B7-961B-2A0B8DAB6AC5}"> >>>>> <File Id="Video.Content.Video.png" >>>>> Source="$(var.Video.ProjectDir)\Resources\Video.png" /> >>>>> </Component> >>>>> <Component Id="Video.Content.vidSmall.png" >>>>> Directory="Video.Content.Resources" >>>>> Guid="{E0FB9672-27B5-42C1-9AF5-783BB9E6852D}"> >>>>> <File Id="Video.Content.vidSmall.png" >>>>> Source="$(var.Video.ProjectDir)\Resources\vidSmall.png" /> >>>>> </Component> >>>>> <Component Id="Video.Content.sample_screen.bmp" >>>>> Directory="Video.Content.Resources" >>>>> Guid="{877913CE-D40F-4233-8F3F-9F3171BEAB81}"> >>>>> <File Id="Video.Content.sample_screen.bmp" >>>>> Source="$(var.Video.ProjectDir)\Resources\sample-screen.bmp" /> >>>>> </Component> >>>>> <Component Id="Video.Content.sample_webcam.bmp" >>>>> Directory="Video.Content.Resources" >>>>> Guid="{6FDD639B-3310-4DF8-AA8C-4553AA43D182}"> >>>>> <File Id="Video.Content.sample_webcam.bmp" >>>>> Source="$(var.Video.ProjectDir)\Resources\sample-webcam.bmp" /> >>>>> </Component> >>>>> <Component Id="Video.Content.Screen.png" >>>>> Directory="Video.Content.Resources" >>>>> Guid="{0BD1BA3A-6485-4899-AC85-6DEA461D02F2}"> >>>>> <File Id="Video.Content.Screen.png" >>>>> Source="$(var.Video.ProjectDir)\Resources\Screen.png" /> >>>>> </Component> >>>>> <Component Id="Video.Content.screenSmall.png" >>>>> Directory="Video.Content.Resources" >>>>> Guid="{9D9C6C86-110B-4ddc-A1F8-AEE388B4B195}"> >>>>> <File Id="Video.Content.screenSmall.png" >>>>> Source="$(var.Video.ProjectDir)\Resources\screenSmall.png" /> >>>>> </Component> >>>>> <Component Id="Video.Content.Cam.png" >>>>> Directory="Video.Content.Resources" >>>>> Guid="{27785913-9433-4ff6-9E62-17DC1AEDDD52}"> >>>>> <File Id="Video.Content.Cam.png" >>>>> Source="$(var.Video.ProjectDir)\Resources\Cam.png" /> >>>>> </Component> >>>>> <Component Id="Video.Content.camSmall.png" >>>>> Directory="Video.Content.Resources" >>>>> Guid="{CD13E295-3077-4353-A68E-ACBD3A333C94}"> >>>>> <File Id="Video.Content.camSmall.png" >>>>> Source="$(var.Video.ProjectDir)\Resources\camSmall.png" /> >>>>> </Component> >>>>> </ComponentGroup> >>>>> </Fragment> >>>>> <Fragment> >>>>> <DirectoryRef Id="Video.Binaries" /> >>>>> </Fragment> >>>>> <Fragment> >>>>> <ComponentGroup Id="Video.Binaries"> >>>>> <ComponentRef Id="Video.Binaries.Modules.Video.dll" /> >>>>> </ComponentGroup> >>>>> </Fragment> >>>>> <Fragment> >>>>> <DirectoryRef Id="Video.Content"> >>>>> <Directory Id="Video.Content.Resources" Name="Resources" /> >>>>> </DirectoryRef> >>>>> </Fragment> >>>>> <Fragment> >>>>> <ComponentGroup Id="Video.Content"> >>>>> <ComponentRef Id="Video.Content.Video.png" /> >>>>> <ComponentRef Id="Video.Content.vidSmall.png" /> >>>>> <ComponentRef Id="Video.Content.sample_screen.bmp" /> >>>>> <ComponentRef Id="Video.Content.sample_webcam.bmp" /> >>>>> <ComponentRef Id="Video.Content.Screen.png" /> >>>>> <ComponentRef Id="Video.Content.screenSmall.png" /> >>>>> <ComponentRef Id="Video.Content.Cam.png" /> >>>>> <ComponentRef Id="Video.Content.camSmall.png" /> >>>>> </ComponentGroup> >>>>> </Fragment> >>>>> <Fragment> >>>>> <DirectoryRef Id="Modules"> >>>>> <Directory Id="Video.Binaries" /> >>>>> </DirectoryRef> >>>>> </Fragment> >>>>> <Fragment> >>>>> <DirectoryRef Id="Modules"> >>>>> <Directory Id="Video.Content" /> >>>>> </DirectoryRef> >>>>> </Fragment> >>>>> </Wix> >>>>> >>>>> >>>>> Thank you in advance! >>>>> MeCoco >>>>> >>>>> >>>>> ------------------------------------------------------------------------------ >>>>> What You Don't Know About Data Connectivity CAN Hurt You >>>>> This paper provides an overview of data connectivity, details >>>>> its effect on application quality, and explores various alternative >>>>> solutions. http://p.sf.net/sfu/progress-d2d >>>>> >>>>> >>>>> _______________________________________________ >>>>> WiX-users mailing list >>>>> WiX-users@lists.sourceforge.net >>>>> https://lists.sourceforge.net/lists/listinfo/wix-users >>>> ------------------------------------------------------------------------------ >>>> What You Don't Know About Data Connectivity CAN Hurt You >>>> This paper provides an overview of data connectivity, details >>>> its effect on application quality, and explores various alternative >>>> solutions. http://p.sf.net/sfu/progress-d2d >>>> _______________________________________________ >>>> WiX-users mailing list >>>> WiX-users@lists.sourceforge.net >>>> https://lists.sourceforge.net/lists/listinfo/wix-users >>>> >>> ------------------------------------------------------------------------------ >>> What You Don't Know About Data Connectivity CAN Hurt You >>> This paper provides an overview of data connectivity, details >>> its effect on application quality, and explores various alternative >>> solutions. http://p.sf.net/sfu/progress-d2d >>> _______________________________________________ >>> WiX-users mailing list >>> WiX-users@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/wix-users >> >> ------------------------------------------------------------------------------ >> Colocation vs. Managed Hosting >> A question and answer guide to determining the best fit >> for your organization - today and in the future. >> http://p.sf.net/sfu/internap-sfd2d >> _______________________________________________ >> WiX-users mailing list >> WiX-users@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/wix-users >> > ------------------------------------------------------------------------------ > Colocation vs. Managed Hosting > A question and answer guide to determining the best fit > for your organization - today and in the future. > http://p.sf.net/sfu/internap-sfd2d > _______________________________________________ > WiX-users mailing list > WiX-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/wix-users ------------------------------------------------------------------------------ Colocation vs. Managed Hosting A question and answer guide to determining the best fit for your organization - today and in the future. http://p.sf.net/sfu/internap-sfd2d _______________________________________________ WiX-users mailing list WiX-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wix-users