none
Windows 8 RP:MsiGetComponentPath(MsiLocateComponent)APIのエラーについて RRS feed

  • 質問

  • Windows8 RP版において、以下の問題が生じております。

    現象の詳細情報、回避方法など、情報がありましたら教えていただけませんでしょうか?

    正確なインストール判定ができないため、プログラムランチャーからプログラムを起動できず、困っております。

    【問題点】

    MsiGetComponentPath(MsiLocateComponent)API をコールしたとき、
    コンポーネントがインストールされているにもかかわらず、Windows8 (RP)上でAPIが失敗してしまいます。

    (インストールされていない、と判定されてしまいます)
    Windows7以前では成功いたします。

    【サンプルコード】

    int _tmain(int argc, _TCHAR* argv[])
    {
    // 現在の言語を設定(ASCII環境以外で文字化けするため)
    TCHAR szLocale[MAX_PATH];
    GetLocaleInfo( GetThreadLocale(), LOCALE_SABBREVLANGNAME, szLocale, MAX_PATH );
    _tsetlocale( LC_ALL, szLocale );
    // インストール状態のダンプ
    std::for_each( checkProductCodes.begin(), checkProductCodes.end(), []( LPCTSTR productCode ){
    INSTALLSTATE installState = MsiQueryProductState( productCode );
    std::wcout << L"MsiQueryProductState( " << productCode << L" ):" << installState << std::endl;
    if( installState >= INSTALLSTATE_LOCAL ){
    TCHAR buff[MAX_PATH+1];
    DWORD len = MAX_PATH;
    MsiGetProductInfo( productCode, INSTALLPROPERTY_PRODUCTNAME, buff, &len );
    std::wcout << L"MsiGetProductInfo( " << productCode << L", " << INSTALLPROPERTY_PRODUCTNAME << L" ):" << buff << std::endl;
    }
    });
    // 実際にチェックする製品(最初に見つけたやつでいい)
    auto itrProductCode = std::find_if( checkProductCodes.begin(), checkProductCodes.end(), []( LPCTSTR productCode )->bool{
    INSTALLSTATE installState = MsiQueryProductState( productCode );
    return installState >= INSTALLSTATE_LOCAL ;
    });
    if( itrProductCode == checkProductCodes.end() ){
    std::wcout << L"Not Installed!!!" << std::endl;
    return 0;
    }
    LPCTSTR productCode = *itrProductCode;
    DWORD cbLength = 0;
    INSTALLSTATE installState = MsiGetComponentPath( productCode, componentId_SupUNI, nullptr, &cbLength );
    std::wcout << L"MsiGetComponentPath( " << productCode << L", " << componentId_SupUNI << L", nullptr, "<< cbLength << L" ):" << installState << std::endl;
    if( cbLength != 0 ){
    cbLength++;
    std::wstring componentPath;
    componentPath.resize(cbLength);
    installState = ::MsiGetComponentPath( productCode, componentId_SupUNI, &componentPath[0], &cbLength );
    std::wcout << L"MsiGetComponentPath( " << productCode << L", " << componentId_SupUNI << L", " << componentPath << L", "<< cbLength << L" ):" << installState << std::endl;
    }
    return 0;
    }


    2012年7月5日 8:36

回答

すべての返信