2017-12-14 25 views
1

私はインストーラでProgram Filesフォルダ を取得するためにwixでProgramFiles64Folderを使用します。wixでProgram Filesフォルダのローカライズされた値を取得するには

問題はフランス語の値であるc:\ Programs の代わりにc:\ Program Filesを表示することです。

それでも正しいフォルダにインストールされますが、私のユーザーはなぜ にフランス語の値が表示されないのかを尋ねています。

orcaでmsiを開きましたが、ProgramFiles64Folderを参照してください。 Windowsのインストーラではなく、特定の問題です。

wixでProgram Filesフォルダのローカライズされた値を取得するにはどうすればよいですか?

+0

MSIログファイルを共有できますか? ProgramFiles64Folderは正しいはずです。 –

答えて

2

表示されているのは、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の値を取得します。

+0

これは決して詳細な回答のためにたくさんありがとうございます –

関連する問題