元ネタはお仕事関係です。Win8もRPになって、あれやこれやといろいろチェック中。。。だったりします。
 メトロいいけど、従来アプリのスタートメニューの登録とかこのままなん?と思いつつ。。。
  
 基本的な動作は問題ないです。すこぶる快調です。
  
 Windows Virtual PC にインストールできない点を除いて。インストールのテストとかマジ面倒。。。<ちが!
  
 CPのころは、CDhtmlDialog が壊滅状態だったりといくつかこのまま出たら致命的だねぇ。。。というものがあったんですが、それらも順当に修正されていたので、まぁ特に問題もなく。。。と思っていたところで発覚しました。
  
 msi のAPI使ってるソフトなんてほとんどないだろうから、誰も気づかなかったんだろうなぁ。。。
 ということで、エラーを見つけました。クラッシュしないけど使ってるソフトは致命傷的なエラー。
 なにせ、状態が正しいと仮定すれば、インストールに失敗してる場合以外にありえない状況だから。。。
 MsiLocateComponent API と、MsiGetComponentPath API が失敗します。
  
 これ、失敗するとどこにファイル入れてあるかわからんのですよ。。。というか、失敗するってことは、インストールしていないという想定で動作になるのですよ。。
 コンポーネントのパスが取れない=コンポーネントはインストールされていないですからね。。。
  
 とりあえず、簡単なMsiLocateComponentのテストコードとして、msvcr100.dll のインストール先パスが取得するものを載せておきます。
 VCとかでコンソールアプリを作成して、中身を適当に入れ替えてください。
 stdafx.h
 #pragma once
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#include <msi.h>
#pragma comment(lib,"msi.lib")
 
 
本体。
 
#include "stdafx.h"
LPCTSTR componentId = _T("{9983C931-37BE-3C6E-AD32-8B6E789B6881}");
int _tmain(int argc, _TCHAR* argv[])
{
  DWORD cbLength = 0;
  INSTALLSTATE instState = MsiLocateComponent( componentId, NULL, &cbLength );
  _tprintf( _T("MsiLocateComponent( %s, NULL, %u ):%d\n"), componentId, cbLength, instState );
  if( cbLength != 0 ){
    cbLength++;
    TCHAR* componentPath = new TCHAR[cbLength];
    instState = MsiLocateComponent( componentId, componentPath, &cbLength );
    _tprintf( _T("MsiLocateComponent( %s, %s, %u ):%d\n"), componentId, componentPath, cbLength, instState );
    delete []componentPath;
  }
  return 0;
}
 
Visual C++ 7.0 以上対応です。6.0も動くと思うけど、古すぎてわかりません。
さて。。。問題は、APIの不具合を報告するパブリックな経路がない。。。というところだよなー。Win8 には報告ツールも入ってないみたいだし。。。