| 分類:[.NET 全般]
W64Bit OSでのOfficeレジストリの取得方法
お世話になります。 以前にOfficeのバージョン取得方法に関して教えていただいた件の 続きになります。
その際、レジストリからExcel等のインストール先を調べ FileVersionInfoにて各種情報を取得するようにプログラムを行いました。 32ビット環境のOSでは取得できたのですがWindows7の64ビット環境で確認した所、 レジストリからインストールパスが取得できないことが判明しました。
おそらく http://d.hatena.ne.jp/tt_clown/20100331/1270016634 に記載されているOpenSubKey(@"SOFTWARE") で取得できるレジストリ値が変化したせいだと考えています。
そこで試しにコンパイルオプションも変えて確認してみました。
AnyCPU 取得できない x86 取得できない x64 取得OK
上記のアドレスで記載されている情報ではx64とAnyCpuは64ビット環境では同じアドレスを 参照するはずですがなぜか異なる動きをします。
AnyCpuが動かない理由は分かりませんがx64ではインストールパスが取得できたので x86ビルドで64ビットOS環境でも「SOFTWARE\Microsoft\Office\」を参照するように 出来ればいと思うのですがどうすればよいでしょうか?
.netの機能を使わずにWindowsAPIでレジストリ値を取得するしかないのでしょうか? どなたか教えていただけないでしょうか?
環境 XP-SP3 VS2005 SP2 .net2.0 "x86" 設定でビルド (仕様によりAnyCPU,x64は使えません。) Win7 64Bit Office2010(32Bit)で動作確認を行っています。
書いたコード
private void button1_Click(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); sb.Append(@"SOFTWARE\Microsoft\Office\"); //sb.Append(@"SOFTWARE\Wow6432Node\Microsoft\Office\"); でも変わらず //sb.Append("10.0");//バージョン(11.0... OfficeXP sb.Append("14.0");//バージョン(11.0... Office2010 sb.Append(@"\"); sb.Append("Excel"); sb.Append(@"\InstallRoot"); string strReg = ""; strReg = sb.ToString(); sb.Length = 0; try { using (Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(strReg, false)) { //キーが存在しないときは null が返される //Win7 64BitだとNullになる if (regkey != null) { string strPath = (string)regkey.GetValue("Path"); strPath += "EXCEL.EXE";
//指定のEXEが存在するか? if (File.Exists(strPath)) { //Ver取得 FileVersionInfo vi = FileVersionInfo.GetVersionInfo(strPath); sb.AppendLine(" " + vi.ProductName + " " + vi.InternalName + " バージョン:" + vi.FileVersion); } } else { MessageBox.Show("regkey=null"); } } } finally {
} MessageBox.Show(sb.ToString()); }
よろしくお願いします。 |