我使用wix中的ProgramFiles64Folder来获取Program Files文件夹 在我的安装程序中。
问题是它显示c:\ Program Files而不是c:\ Programs 这是法国人的价值。
它仍然安装到正确的文件夹,但我的用户问为什么 他们没有看到法国的价值。
我用orca打开了msi,我看到了ProgramFiles64Folder 我想这不是一个特定于wix的问题,而是一个Windows安装程序。
如何使用wix获取Program Files文件夹的本地化值?
答案 0 :(得分:2)
您所看到的是Win32文件系统路径,该路径不再从Windows Vista开始本地化。你想要的是shell的本地化显示路径。
Windows Installer仅在其内置UI中显示文件系统路径。我对WiX Burn UI不太确定,但很可能它也只显示文件系统路径。
您可以编写DLL自定义操作(请参阅MSDN和WiX参考)以获取显示路径。
以下是一个简单的控制台应用程序的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
的值,该属性包含我们感兴趣的显示路径。