Wix 从路径中获取价值 [英] Wix get value from paths

查看:25
本文介绍了Wix 从路径中获取价值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嘿,我正在创建一个程序的安装程序,该程序依赖于另一个名为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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆