如何使用wix获取Program Files文件夹的本地化值

时间:2017-12-14 19:21:33

标签: wix windows-installer

我使用wix中的ProgramFiles64Folder来获取Program Files文件夹 在我的安装程序中。

问题是它显示c:\ Program Files而不是c:\ Programs 这是法国人的价值。

它仍然安装到正确的文件夹,但我的用户问为什么 他们没有看到法国的价值。

我用orca打开了msi,我看到了ProgramFiles64Folder 我想这不是一个特定于wix的问题,而是一个Windows安装程序。

如何使用wix获取Program Files文件夹的本地化值?

1 个答案:

答案 0 :(得分:2)

您所看到的是Win32文件系统路径,该路径不再从Windows Vista开始本地化。你想要的是shell的本地化显示路径

Windows Installer仅在其内置UI中显示文件系统路径。我对WiX Burn UI不太确定,但很可能它也只显示文件系统路径。

您可以编写DLL自定义操作(请参阅MSDNWiX参考)以获取显示路径。

以下是一个简单的控制台应用程序的C ++代码,演示了如何将文件系统路径转换为显示路径。在自定义操作中,您可以调用MsiGetProperty来获取包含安装路径的directory属性的值,使用类似于我的示例的代码将其转换为显示路径,最后调用MsiSetProperty来分配显示您将在UI中显示的另一个属性的路径。

#include <Windows.h>
#include <ShlObj.h>    // Shell API
#include <Propkey.h>   // PKEY_* constants
#include <atlcomcli.h> // CComPtr
#include <atlbase.h>   // CComHeapPtr
#include <iostream>
#include <io.h>
#include <fcntl.h>

// Convert a filesystem path to the shell's localized display path.
HRESULT GetDisplayPathFromFileSystemPath( LPCWSTR path, PWSTR* ppszDisplayPath )
{
    CComPtr<IShellItem2> pItem;
    HRESULT hr = SHCreateItemFromParsingName( path, nullptr, IID_PPV_ARGS( &pItem ) );
    if( FAILED( hr ) )
        return hr;
    return pItem->GetString( PKEY_ItemPathDisplay, ppszDisplayPath );
}

int main()
{
    CoInitialize( nullptr );  // TODO: check return value
    _setmode( _fileno( stdout ), _O_U16TEXT );  // for proper UTF-16 console output

    LPCWSTR fileSystemPath = L"C:\\Users\\Public\\Pictures";
    CComHeapPtr<WCHAR> displayPath;
    if( SUCCEEDED( GetDisplayPathFromFileSystemPath( fileSystemPath, &displayPath ) ) )
    {
        // Output the localized display path
        std::wcout << static_cast<LPCWSTR>( displayPath ) << std::endl;
    }

    CoUninitialize();
}

这里唯一真正重要的代码是GetDisplayPathFromFileSystemPath()函数。它调用SHCreateItemFromParsingName()从文件系统路径创建IShellItem2对象。从该对象中,它检索属性PKEY_ItemPathDisplay的值,该属性包含我们感兴趣的显示路径。