2012-12-14 37 views
1

嗨即時通訊創建一個程序的安裝程序,這取決於另一個名爲「visma」的程序,我想要做的只是當用戶選擇安裝路徑。Wix從路徑獲得價值

用戶還需要指定兩個安裝visma的路徑。 然後我想從輸入讀取一個txt文件或其他東西,所以我可以在程序之後讀取路徑並複製一些我需要從visma文件。

enter image description here

這是我多遠的UI獲得的安裝工程和它的工作

,但我不知道如何創建需要改變默認的路徑這三個領域取得的目錄變量在圖片

MYInstalldirdlg

*

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
<Fragment> 
    <UI> 
     <Dialog Id="MYInstallDirDlg" Width="370" Height="270" Title="!(loc.InstallDirDlg_Title)"> 
      <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)" /> 
      <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" /> 
      <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)"> 
       <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish> 
      </Control> 

      <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes" Text="Choose default or your own folder for install and specify visma folders" /> 
      <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="{\WixUI_Font_Title}Destination Folders" /> 
      <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.InstallDirDlgBannerBitmap)" /> 
      <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" /> 
      <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" /> 


      <Control Id="FolderLabel1" Type="Text" X="20" Y="50" Width="290" Height="12" NoPrefix="yes" Text="!(loc.InstallDirDlgFolderLabel)" /> 
      <Control Id="Folder1" Type="PathEdit" X="20" Y="65" Width="320" Height="18" Property="WIXUI_INSTALLDIR" Indirect="yes" /> 
      <Control Id="ChangeFolder1" Type="PushButton" X="20" Y="85" Width="56" Height="15" Text="!(loc.InstallDirDlgChange)" /> 

      <Control Id="FolderLabel2" Type="Text" X="20" Y="110" Width="290" Height="12" NoPrefix="yes" Text="Please specify where your Visma Administration installation folder is:" /> 
      <Control Id="Folder2" Type="PathEdit" X="20" Y="125" Hidden ="no" Width="320" Height="18" Property="WIXUI_INSTALLDIR" Indirect="yes" /> 
      <Control Id="ChangeFolder2" Type="Text" X="20" Y="150" Width="56" Height="18" Text="Change..." /> 

      <Control Id="FolderLabel3" Type="Text" X="20" Y="175" Width="290" Height="22" NoPrefix="yes" Text="Please specify where your SPCS folder is which contains (Företag) and (Gemensamma filer):" /> 
      <Control Id="Folder3" Type="PathEdit" X="20" Y="195" Hidden ="no" Width="320" Height="18" Property="WIXUI_INSTALLDIR" Indirect="yes" /> 
      <Control Id="ChangeFolder3" Type="Text" X="20" Y="215" Width="56" Height="18" Text="Change..." /> 
     </Dialog> 
    </UI> 
</Fragment> 

當你看到他們都有他們從我的目錄WIXUI_INSTALLDIR得到相同的路徑

WixUI_MYInstallDir

*

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
<Fragment> 
    <UI Id="WixUI_MYInstallDir"> 
     <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" /> 
     <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" /> 
     <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" /> 

     <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" /> 
     <Property Id="WixUI_Mode" Value="InstallDir" /> 

     <DialogRef Id="BrowseDlg" /> 
     <DialogRef Id="DiskCostDlg" /> 
     <DialogRef Id="ErrorDlg" /> 
     <DialogRef Id="FatalError" /> 
     <DialogRef Id="FilesInUse" /> 
     <DialogRef Id="MsiRMFilesInUse" /> 
     <DialogRef Id="PrepareDlg" /> 
     <DialogRef Id="ProgressDlg" /> 
     <DialogRef Id="ResumeDlg" /> 
     <DialogRef Id="UserExit" /> 

     <Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="3">1</Publish> 
     <Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="4"><![CDATA[WIXUI_INSTALLDIR_VALID<>"1"]]></Publish> 

     <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish> 

     <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">NOT Installed</Publish> 
     <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish> 

     <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish> 
     <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="MYInstallDirDlg">LicenseAccepted = "1"</Publish> 

     <Publish Dialog="MYInstallDirDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish> 
     <Publish Dialog="MYInstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish> 
     <Publish Dialog="MYInstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish> 
     <Publish Dialog="MYInstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish> 
     <Publish Dialog="MYInstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish> 
     <Publish Dialog="MYInstallDirDlg" Control="ChangeFolder1" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish> 
     <Publish Dialog="MYInstallDirDlg" Control="ChangeFolder1" Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish> 

     <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MYInstallDirDlg" Order="1">NOT Installed</Publish> 
     <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish> 
     <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">Installed AND PATCH</Publish> 

     <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish> 

     <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish> 
     <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish> 
     <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish> 

     <Property Id="ARPNOMODIFY" Value="1" /> 
    </UI> 

    <UIRef Id="WixUI_MYCommon" /> 
</Fragment> 

這裏我只是做了必要的修改,使其工作:改到WixUI_MYInstallDir和這樣這樣的名稱相匹配

產品

*

<!-- Directory 1 (install folder) --> 
<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="ProgramFilesFolder"> 
    <Directory Id="INSTALLDIR" Name="ITC_Venato" > 
    </Directory> 
      //componet stuff and files to install 
    </Directory> 
</Directory> 

<Feature 
    Id="Venato_Windows_Service_0.904" 
    Title="Venato Windows Service" 
    Level="1"> 
    <ComponentRef Id="Venatoexe" /> 
</Feature> 

<!-- Include a user interface--> 
<Property Id="WIXUI_INSTALLDIR">INSTALLDIR</Property> 
<UIRef Id="WixUI_MYInstallDir" /> 
<UIRef Id="WixUI_ErrorProgressText" /> 

只包括相關的部分,但我訂購時有一個wix和產品標籤,但我想我必須爲我想要的新文件夾路徑創建一個新的屬性ID。

但我該如何讓程序只讀取路徑並將它們發送給我可以讀取的變量或文本文件。我不想讓程序像安裝路徑一樣創建新文件夾。這些應該由用戶選擇,然後閱讀。

謝謝你的答案!

*

*

*

*

錯誤

enter image description here

回答

1

使用不同的像你提到的性質:

<Property Id="WIXUI_INSTALLDIR">INSTALLDIR</Property> 
<Property Id="VISMA_ADMIN" Secure="yes"></Property> 
<Property Id="SPCS_FOLDER">INSTALLDIR</Property> 

<Control Id="FolderLabel2" Type="Text" X="20" Y="110" Width="290" Height="12" NoPrefix="yes" Text="Please specify where your Visma Administration installation folder is:" /> 
<Control Id="Folder2" Type="PathEdit" X="20" Y="125" Hidden ="no" Width="320" Height="18" Property="VISMA_ADMIN" Indirect="yes" /> 
<Control Id="ChangeFolder2" Type="Text" X="20" Y="150" Width="56" Height="18" Text="Change..." /> 

<Control Id="FolderLabel3" Type="Text" X="20" Y="175" Width="290" Height="22" NoPrefix="yes" Text="Please specify where your SPCS folder is which contains (Företag) and (Gemensamma filer):" /> 
<Control Id="Folder3" Type="PathEdit" X="20" Y="195" Hidden ="no" Width="320" Height="18" Property="SPCS_FOLDER" Indirect="yes" /> 
<Control Id="ChangeFolder3" Type="Text" X="20" Y="215" Width="56" Height="18" Text="Change..." /> 

如果您想將它們保存到文本文件,那麼我會使用自定義操作。下面是我如何將數據保存到文本文件的代碼。

extern "C" UINT __stdcall GetLoggersInfo(MSIHANDLE hInstall) 
{ 
HRESULT hr = S_OK; 
UINT er = ERROR_SUCCESS; 
char szLocation[MAX_PATH]; 
LPWSTR szValueBuf = NULL, szInstallDir = NULL, szVismaAdmin = NULL; 

hr = WcaInitialize(hInstall, "GetLoggersInfo"); 
ExitOnFailure(hr, "Failed to initialize"); 

WcaLog(LOGMSG_STANDARD, "Initialized."); 

hr = WcaGetProperty(L"VISMA_ADMIN",&szVismaAdmin); 
ExitOnFailure(hr, "failed to get folder"); 

hr = WcaGetProperty(L"SPCS_FOLDER",&szValueBuf); 
ExitOnFailure(hr, "failed to get folder"); 

我假設你正在安裝的產品的文本文件,以便獲得它在目錄:

hr = WcaGetProperty(L"INSTALLDIR",&szInstallDir); 
ExitOnFailure(hr, "failed to get install location"); 

wcstombs(szLocation, szValueBuf, 260); 
strcat(szLocation, "\\NameOfTextFile.txt"); 


CString lpszString = CString("Visma Admin:") + szVismaAdmin + "\r\n"; 

hr = AppendInfo(szLocation,lpszString); 
ExitOnFailure(hr, "failed to append the NameOfTextFile.txt file with the 

LExit: 
ReleaseStr(szValueBuf); 
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; 
return WcaFinalize(er); 
} 

和輔助功能:

HRESULT AppendInfo(__in LPCSTR lpszFile, __in LPCSTR lpszEntry) 
{ 
HRESULT hr = S_OK; 
HANDLE hFile; 
DWORD dwWritten; 
CHAR szError[MAX_PATH*2]; 
CHAR szTitle[MAX_PATH]; 

try 
{ 
    if ((hFile = CreateFile(lpszFile, 
     GENERIC_READ|GENERIC_WRITE, 
     FILE_SHARE_READ | FILE_SHARE_WRITE, 
     NULL, 
     OPEN_EXISTING, 
     FILE_ATTRIBUTE_NORMAL, 
     NULL)) == INVALID_HANDLE_VALUE) 
    { 
     // Error: Couldn't Open File. Handle error 

    } 

    // No Entry Exists. 
    SetFilePointer(hFile, 0, NULL, FILE_END); 

    if (!WriteFile(hFile,lpszEntry,lstrlen(lpszEntry),&dwWritten,NULL)) 
    { 
     CloseHandle(hFile); 
     //HandleError 
    } 

    CloseHandle(hFile); 
} 
catch(int e) 
{ 
    // A failure caused an exception! 
    //Handle Error 
} 

return hr; 
} 

編輯:忘了提到添加自定義操作,並安排它後InstallFinalize

+0

謝謝:)這將幫助很多:)但做我不得不在項目中創建目錄,或者只是它顯示默認地圖?有一個我不明白的錯誤編輯了你的第一個代碼 – Dendei

+1

的變化,那個錯誤意味着有一個控件需要一個屬性鏈接到它。詳細記錄確切發現問題的一個好方法是詳細記錄。這兩個網站應該可以幫到你。 http://wix.sourceforge.net/manual-wix3/get_a_log.htm,http://msdn.microsoft.com/en-us/library/windows/desktop/aa372835%28v=vs.85%29.aspx –

+0

非常感謝。我會仔細看看的 – Dendei