アップグレードコード製品をアップグレードするとは、既にインストール済みの製品を新しい製品に置き換えることです。次のようなコードで簡単に実装できるように思えます。それを利用してMsiQueryProductStateで製品のインストール状態を確認できます。MsiConfigureProductにINSTALLSTATE_ABSENTを指定してアンインストールを行います。最終的にはMsiInstallProductで新しい製品をインストールしようとしています。実際にはMSIが提供するアップグレードのメカニズムを利用したほうがはるかに効率的です。単純にMSIファイルを公開するだけでアップグレードを行えます。旧バージョンのMSIファイルのプロパティのそれと異なっていなければなりません。UpgradeCodeプロパティに関しては同一にしておかなければなりません。製品コードと同じようにGUID形式で一意の値となります。アップグレードコードで識別することのできる1つの製品グループということになります。その製品のMSIファイルのUpgradeCodeプロパティにアクセスしなければなりません。MsiOpenProductで取得したハンドルを使うということなります。Propertyテーブルにアクセスするには、MsiGetProductPropertyを呼び出します。*pcchValueBuf);hProductは、MsiOpenProductで取得したハンドルを指定します。szPropertyは、Propertyテーブルから取得したいプロパティの名前を指定します。lpValueBufは、プロパティのデータを受け取るバッファのアドレスを指定します。pcchValueBufは、lpValueBufのサイズを格納した変数のアドレスを指定します。今回のプログラムは、既存製品の製品コードからアップグレードコードを取得します。szProductCodeを既存製品の製品コードで初期化しておいてください。MsiSetInternalUIにINSTALLUILEVEL_NONEを指定することでこれを無効にします。第2引数にUpgradeCodeプロパティを指定します。旧バージョンの製品は依然として残しておきたい場合があります。アップグレードコードを同一にしておくのもよいかもしれません。MsiEnumRelatedProductsを利用してグループ内の製品を列挙することができます。Studioの2002と2003は、この例に当てはまります。そのアップグレードコードを持つ製品の製品コードが第4引数に返ることになります。第2引数は常に0を指定し、第3引数はゼロベースのインデックスを指定します。MsiEnumRelatedProductsを利用する場合は、_WIN32_WINNTを0x0500と定義します。