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

标签 c++ windows wix windows-installer

我有以下 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='Sources\ca-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 标记中,我使用本地化 .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 数据库和 session 表。要访问的公共(public)表是 Properties 表。

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

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

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

关于c++ - 我可以通过 WiX 的自定义操作访问 .wxl 本地化文件中的字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17823564/

相关文章:

c++ - X11 窗口不放入 QWidget 以嵌入 Qt 应用程序

c++ - 使用平假名将 std::wstring 转换为 QString

windows - 您将如何编写 .bat 或 .cmd 文件以从 PATH 中删除元素?

sql-server - WiX:DB Restore 不恢复表和记录

WiX 自定义操作 - MSI 复制自身

wix - 默认情况下,每用户 MSI 未提升 - 如何显示写入文件夹的提升提示?

c++ - 为模板化类创建类型别名

c++ - OpenNI 链接错误,大量 undefined reference

c++ - GCC STL 是线程安全的吗?

c - 在内核模式下打开 win-socket (tcp) 并指定序列号