2008年12月31日
川俣晶の縁側ソフトウェア技術雑記 total 16447 count

Platform SDKのサンプルソース「だけ」インストールするとVisual Studio 2008からwindows.hが見つからない問題

Written By: 川俣 晶連絡先

 ちょっと意外かつややこしい問題に遭遇したのでメモ。(2008/12/31 15:03。不備があったので全面訂正)

時系列 §

  1. Visual Studio 2008を使用していた。C/C++ソースからwindows.hを使用できていた
  2. Platform SDKのサンプルソースが見たくなったので、適当にMSDNのDVDから「サンプルソースだけ選んで」インストールした
  3. Visual Studio 2008(IDE, Visual Stuio 2008コマンドプロンプトとも)からwindows.hが見つからないと言われるようになった

原因 §

 当初Visual Studio 2008が参照したPlatform SDKはD:\Program Files\Microsoft SDKs\Windows\v6.0A\であった。これに対して、後から入れたPlatform SDKはD:\Program Files\Microsoft SDKs\Windows\v6.0\に入った。(名前のAの有無が異なる)

 Platform SDKのインストール位置はレジストリのHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\WindowsとHKEY_CURRENT_USER\Software\Microsoft\Microsoft SDKs\WindowsのCurrentInstallFolderに設定されているが、これに伴い内容が変更された。

 D:\Program Files\Microsoft SDKs\Windows\v6.0A\にはincludeファイルが含まれるが、変更後のパスとなるPlatform SDKはD:\Program Files\Microsoft SDKs\Windows\v6.0\はサンプルソースしか入れていないので、当然includeファイルはない。

 以上の理由により、Visual Studio 2008はwindows.hを発見できなくなる。

解決 §

  • 安易な解決→レジストリエディタで上記のキーの値を元に戻す
  • 地道な解決→たぶん、Visual Studio 2008の再インストールで直るのではないかと思いますが、未検証

補足その1 §

 Visual Stuio 2008コマンドプロンプトはHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windowsを。

 Visual Stuio 2008 IDEはHKEY_CURRENT_USER\Software\Microsoft\Microsoft SDKs\Windowsを参照しているようです。

 完全修復するには双方を修正する必要があるようです。

補足その2 §

 Visual Stuio 2008コマンドプロンプトはレジストリを参照して環境変数includeを設定する賢いバッチを含むので、実はレジストリ変更の影響を直接的にかぶってしまう。従って、環境変数に関するシステム側の設定を一切変更しなくとも、レジストリ変更の影響を受ける。

 ただし、環境変数という機能の性質上、Platform SDKがインストールされる前に開かれたVisual Stuio 2008コマンドプロンプトは影響を受けない。そのため、問題の発覚が大幅に遅延され、問題の原因特定が遅れる可能性がある。(例、Platform SDKインストール直後ではなく、翌日の仕事開始時まで発覚が遅れる等)

感想 §

 つまり、私の目の前で問題の原因特定が遅れました。とほほ……。

 それにしても、問題の調査で中を調べたvsvars32.bat (Visual Stuio 2008コマンドプロンプトの正体であるvcvarsall.batから間接的に呼ばれる相手)の中身の凝りようは目から鱗が落ちました。バッチでレジストリに書かれたパスを読み出して思い通りに取り込んでいるとは。

 分かってしまえば単純明快な問題ですが、バッチがレジストリに関連する可能性を、当初は思いつくことができませんでした。

 ついでに、IDEとコマンドプロンプトで別のキーを参照しているとは気付かず、これにも時間を取られました。