Wix 从路径中获取价值 [英] Wix get value from paths
问题描述
嘿,我正在创建一个程序的安装程序,该程序依赖于另一个名为visma"的程序,我想要做的只是当用户选择安装路径时.
Hey im creating an installer of a program that is depending on another program called "visma" what i want to do is simply that when the user will choose the install path.
用户还需要指定另外两个安装 visma 的路径.然后我想从该输入读取到 txt 文件或其他内容,以便稍后我可以在程序之外读取路径并从 visma 复制我需要的一些文件.
That the user also needs to specify two more paths where they have installed visma. and then i would like to read from that input to a txt file or something else so i can outside the program later on read the paths and copy some files i need from visma.
这是我在用户界面中安装工作并完成其工作的距离
this is how far i have got in the UI the install works and does its job
但我不知道如何创建更改图片中三个字段获得的默认路径所需的目录变量
but i dont know how to create the directory variables needed to change the default path the three fields get in the picture
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
as you see they all have the same path they get from my directory 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 等以便名称匹配
here i have only made the necessary changes to make it work: changed to WixUI_MYInstallDir and such so the names match
产品
*
<!-- 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.
only included the relevant parts but i have a wix and product tags on order but i guess i have to make a new Property Id to my new folder paths i want.
但是我怎么做才能让程序只读取路径并将它们发送到我可以读取的变量或文本文件中.我不希望程序像安装路径一样创建新文件夹.Theese 应该由用户选择 visma 所在的位置然后阅读.
but how do i make it so the program just reads the paths and send them to a variable i can read or into a text file. I dont want the program to create new folder like it does with the install path. theese should just be picked by the user where visma is and then read.
感谢您的回答!
*
*
*
*
错误
推荐答案
使用您提到的不同属性:
Use different properties like you mentioned:
<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..." />
如果您想将它们保存到文本文件中,那么我将使用自定义操作.这是关于如何将数据保存到文本文件的代码.
If you want to save them to a text file then I would use a custom action. Heres my code on how I save data to a text file.
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");
我假设您正在安装带有产品的文本文件,因此获取它所在的目录:
I am assuming you are installing the text file with the product so get the directory it is in:
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
forgot to mention to add the custom action and schedule it after InstallFinalize
这篇关于Wix 从路径中获取价值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!