我有以下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标记中,我对字符串使用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数据库和会话表。常用的表是“属性”表。

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

(但是,不,除非您以其他方式使用.wxl,否则自定义操作无法直接从.wxl文件中读取它们。安装程序中通常不包含项目中的.wxl文件,只是作为个别的本地化字符串引用替换。 )

换句话说,您可能对此想法过度了。只需设置并使用具有局部值的属性即可。

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

10-12 23:57