我可以通过WiX的自定义操作访问.wxl本地化文件中的字符串吗

Can I access strings from a .wxl localization file from a custom action with WiX?

本文关键字:文件 本地化 wxl 字符串 访问 可以通过 WiX 自定义 操作      更新时间:2023-10-16

我有以下WiX标记,指示MSI安装程序从包含的DLL中调用自定义操作:

<CustomAction Id="CA_SetProperties_Finalize" 
        Property="CA_OnInstallFinalize" 
           Value="[Installed],[REINSTALL],[UPGRADINGPRODUCTCODE],[REMOVE]" />
<CustomAction Id='CA_OnInstallFinalize' 
       BinaryKey='CADll' 
        DllEntry='msiOnInstallFinalize' 
         Execute='deferred' Impersonate='no' />
<InstallExecuteSequence>
  <Custom Action='CA_SetProperties_Finalize' 
          Before='InstallFinalize'></Custom>
  <Custom Action='CA_OnInstallFinalize' 
           After='CA_SetProperties_Finalize'></Custom>
</InstallExecuteSequence>
<Binary Id='CADll' SourceFile='Sourcesca-installer.dll' />

DLL本身有以下用于自定义操作的C++代码:

#pragma comment(linker, "/EXPORT:msiOnInstallFinalize=_msiOnInstallFinalize@4")
extern "C" UINT __stdcall msiOnInstallFinalize(MSIHANDLE hInstall) 
{
    //Do the work
    if(doWork(hInstall) == FALSE)
    {
        //Error, cannot continue, display end-user message...
        PMSIHANDLE hRecord = MsiCreateRecord(0);
        MsiRecordSetString(hRecord, 0, TEXT("Error cannot continue!"));
        MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
        return ERROR_INSTALL_FAILURE;
    }
    return ERROR_SUCCESS;
}

正如您所看到的,最终用户消息是硬编码的。在我实际的WiX标记中,我使用localization.wxl文件作为字符串,例如:

<Property Id="ARPCONTACT" Value="!(loc.ContactInfo)" Secure="yes" />

然后,例如,lang_en-us.wxl文件将是:

<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
  <String Id="ContactInfo">To get hold of me yell out of the window...</String>
</WixLocalization>

所以我很好奇,有没有办法从我的C++自定义操作代码中的.wxl文件访问这些本地化字符串?

您可以通过自定义操作访问Windows Installer数据库和会话表。要访问的常用表是Properties表。

正如您所知,WiX将为其构建.msi的每个区域性构建具有本地化值的数据库表。因此,是的,本地化字符串可以作为属性值访问。

(但是,不,自定义操作不能直接从.wxl文件中读取它们,除非您以不同的方式使用.wxl。项目中的.wxl通常不包括在安装程序中,除非作为单独的本地化字符串引用替换。)

换句话说,你可能想得太多了。只需设置并使用具有本地化值的属性即可。