表示されているのは、Win32ファイルシステムのパスです。これは、Windows Vista以降はローカライズされていません。代わりに、シェルのローカライズされた表示パスが必要です。
Windowsインストーラは、ビルドインUIにファイルシステムパスのみを表示します。私はWiX Burn UIについては確信していませんが、ファイルシステムのパスのみを表示する可能性が最も高いでしょう。
表示パスを取得するには、DLLのカスタムアクション(MSDNおよびWiX参照)を書き込むことができます。
次は、ファイルシステムパスを表示パスに変換する方法を示す簡単なコンソールアプリケーションのC++コードです。カスタムアクションでは、MsiGetProperty
を呼び出して、インストールパスを含むディレクトリプロパティの値を取得し、私の例と同様のコードを使用して表示パスに変換し、最後に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
の値を取得します。
MSIログファイルを共有できますか? ProgramFiles64Folderは正しいはずです。 –