C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 64BitOSでのOfficeレジストリの取得方法


(過去ログ 88 を表示中)

[トピック内 19 記事 (1 - 19 表示)]  << 0 >>

■52275 / inTopicNo.1)  64BitOSでのOfficeレジストリの取得方法
  
□投稿者/ まぐねしうむ (102回)-(2010/08/04(Wed) 21:58:22)

分類:[.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());
        }

よろしくお願いします。

引用返信 編集キー/
■52276 / inTopicNo.2)  Re[1]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ よねKEN (570回)-(2010/08/04(Wed) 22:46:03)
No52275 (まぐねしうむ さん) に返信
> 環境
> XP-SP3 VS2005 SP2 .net2.0 "x86" 設定でビルド (仕様によりAnyCPU,x64は使えません。)
> Win7 64Bit Office2010(32Bit)で動作確認を行っています。

★開発&実行環境
Windows 7 Ultimate 64bit、VS2008 SP1、
Office2007(32bittというかOffice2007までは32bit版しかない)(内部バージョン番号は12)


(1) sb.Append(@"SOFTWARE\Microsoft\Office\");
(2) sb.Append(@"SOFTWARE\Wow6432Node\Microsoft\Office\");

       (1) (2)
------------------ 
x32    OK  OK
x64    NG  OK 
AnyCPU NG  OK

という結果になりました。
regedt32.exeでレジストリを覗いてみると(2)の場所にあることを確認しました。
この結果を見る限りでは、x32でコンパイルしている場合、
WOW64環境で動作するので通常のレジストリアクセス(1)でアクセスしても、
(2)を見に行くような振る舞いが裏で行われるのかな、という感じですね。

x64(および結果的にx64であるAnyCpu)では、(1)のレジストリアクセスはNGですが、
(2)のように実体のある場所を直接指定すればとれるようです。

> 書いたコード
>             sb.Append("14.0");//バージョン(11.0... Office2010

14.0→12.0に変えただけです。後は、(1)、(2)の内容を切り替えながら実験しました。

以上、微妙に環境の違う部分がありますが、概ね同じような環境での実験結果です。

regedt32.exeで実際のレジストリの位置を確認してみてはどうでしょうか?

引用返信 編集キー/
■52279 / inTopicNo.3)  Re[2]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ Azulean (588回)-(2010/08/04(Wed) 23:20:38)
2010/08/04(Wed) 23:20:55 編集(投稿者)

No52276 (よねKEN さん) に返信
> (2) sb.Append(@"SOFTWARE\Wow6432Node\Microsoft\Office\");
念のため。
http://msdn.microsoft.com/ja-jp/library/aa384232.aspx

> リダイレクトされるキーは、Wow6432Node に含まれる物理的な場所にマップされます。
> たとえば、HKEY_LOCAL_MACHINE\Software は HKEY_LOCAL_MACHINE\Software\Wow6432Node にリダイレクトされます。
> ただし、リダイレクトされるキーの物理的な場所は、システムによって予約されていると見なす必要があります。
> この場所は変更される可能性があるため、アプリケーションでキーの物理的な場所に直接アクセスしないでください。

# URL修正。
引用返信 編集キー/
■52289 / inTopicNo.4)  Re[2]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ (103回)-(2010/08/05(Thu) 09:46:39)
No52276 (よねKEN さん) に返信

> regedt32.exeで実際のレジストリの位置を確認してみてはどうでしょうか?
確認してみました。
やはり理由は不明ですが
SOFTWARE\Microsoft\Office\配下にレジストリが書き込まれています。
コンピュータ\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Excel\InstallRootです。

Wow6432Node の方を確認した所、KEY自体はありましたが値が入力されておりませんでした。
もしかすると、Office2010から64ビットがありますので、
64ビットの場合Wow6432Node側に記載されるのかも知れません。
そう考えると、自分の調査結果が正しい気がします。

AnyCPU 取得OK    HKEY_LOCAL_MACHINE\Software
x86  取得できない HKEY_LOCAL_MACHINE\Software\Wow6432Node
x64  取得OK    HKEY_LOCAL_MACHINE\Software

再度確認した所、AnyCpuでも取得できました。

x86ビルドでかつHKEY_LOCAL_MACHINE\Software を見に行くように出来ればOKだと思うのですが
何か良い手は無いでしょうか?


引用返信 編集キー/
■52298 / inTopicNo.5)  Re[3]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ 中博俊 (1441回)-(2010/08/05(Thu) 10:49:44)
たぶんいい手は無いでしょうねぇ。
そもそも何のためにレジストリ取得したいんですか?
引用返信 編集キー/
■52301 / inTopicNo.6)  Re[4]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ (104回)-(2010/08/05(Thu) 11:00:51)
No52298 (中博俊 さん) に返信
> たぶんいい手は無いでしょうねぇ。
> そもそも何のためにレジストリ取得したいんですか?

インストールされているOfficeの調査です。
拡張子から実行されるEXEを取得する方法や、Officeアプリケーションを起動してバージョンを取得する方法も
ありますが、それだと複数のOfficeがインストールされていた場合に1個しか取れないので
レジストリからインストールされているパスを取得し、実際にそこにEXEがあるかを調査
EXEがあればバージョンを取得しています。
引用返信 編集キー/
■52304 / inTopicNo.7)  Re[3]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ とっちゃん (537回)-(2010/08/05(Thu) 12:22:03)
とっちゃん さんの Web サイト
No52289 (まぐねしうむ さん) に返信

> AnyCPU 取得OK    HKEY_LOCAL_MACHINE\Software
> x86  取得できない HKEY_LOCAL_MACHINE\Software\Wow6432Node
> x64  取得OK    HKEY_LOCAL_MACHINE\Software
>
> 再度確認した所、AnyCpuでも取得できました。
>
> x86ビルドでかつHKEY_LOCAL_MACHINE\Software を見に行くように出来ればOKだと思うのですが
> 何か良い手は無いでしょうか?
>
もしかして、インストールされているOffice2010が、64bit版ということはないですか?

それとも、Office2010は、x86/x64に関係なく、HKLM\Software に書き込むようになってるのかな?
x86版のOffice2010をインストールしてる x64なOSがないのでわからないや。



レジストリのリダイレクトについては一応対策方法はあります。
ただし、「.NET Framework は対応していない」ので、APIを使う必要があります。


RegOepnKeyEx というAPI(レジストリキーをオープンするAPI)の REGSAM 型のパラメータに
KEY_WOW64_64KEY あるいは、KEY_WOW64_32KEY というフラグを追加してやると
リダイレクトモードが切り替わります。

使ったことがないので、どのフラグがどちらになるのか?などはわかりません。
実際に試してみて確認してみてください。

引用返信 編集キー/
■52305 / inTopicNo.8)  Re[4]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ (105回)-(2010/08/05(Thu) 12:34:02)
No52304 (とっちゃん さん) に返信

> もしかして、インストールされているOffice2010が、64bit版ということはないですか?
確認してみましたが、32ビット版のOfficeです。

> それとも、Office2010は、x86/x64に関係なく、HKLM\Software に書き込むようになってるのかな?
> x86版のOffice2010をインストールしてる x64なOSがないのでわからないや。
本当はOS&Officeがx64環境があればもうちょっと中身が分かると思うのですが
あいにく環境がないのでどうしようもありません・・・。

> レジストリのリダイレクトについては一応対策方法はあります。
> ただし、「.NET Framework は対応していない」ので、APIを使う必要があります。
> RegOepnKeyEx というAPI(レジストリキーをオープンするAPI)の REGSAM 型のパラメータに
> KEY_WOW64_64KEY あるいは、KEY_WOW64_32KEY というフラグを追加してやると
> リダイレクトモードが切り替わります。
やはりAPIになりますか・・・。
http://www.pinvoke.net/default.aspx/advapi32/regopenkeyex.html
にサンプルも見つかりましたので.net4.0になるとメソッドが増えるみたいですが、
.net2.0なのでご提示いただいたRegOepnKeyEx で確認してみたいと思います。

引用返信 編集キー/
■52319 / inTopicNo.9)  Re[5]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ Jitta on the way (658回)-(2010/08/05(Thu) 18:54:25)
インストール情報からインストール場所を探せば良いのでは?
引用返信 編集キー/
■52327 / inTopicNo.10)  Re[6]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ 渋木宏明 (24回)-(2010/08/06(Fri) 02:44:12)
渋木宏明 さんの Web サイト
2010/08/06(Fri) 02:49:29 編集(投稿者)

> インストール情報からインストール場所を探せば良いのでは?

可能性としてはあるけど、Office は製品のバリエーションが多いので、すべての ProductID を知るのは難しそう。

あと、Suite 系の製品だと、個々の製品のインストール状況までは MSI API から知ることはできないし。

引用返信 編集キー/
■52328 / inTopicNo.11)  Re[5]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ 渋木宏明 (25回)-(2010/08/06(Fri) 02:50:51)
渋木宏明 さんの Web サイト
>>そもそも何のためにレジストリ取得したいんですか?
>
> インストールされているOfficeの調査です。

どの時点でのチェックですか?

アドインのインストール時にチェックしようという目論見なら、あまり効果はなさそうな気が。

アドインをインストールした後に、Office のインストール状況なんてなんぼでも変化しますよね?
引用返信 編集キー/
■52344 / inTopicNo.12)  Re[6]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ (106回)-(2010/08/06(Fri) 11:29:36)
2010/08/06(Fri) 11:31:18 編集(投稿者)

No52328 (渋木宏明 さん) に返信

> どの時点でのチェックですか?
> アドインのインストール時にチェックしようという目論見なら、あまり効果はなさそうな気が。
> アドインをインストールした後に、Office のインストール状況なんてなんぼでも変化しますよね?
C#からOffice製品をたたくコードを書いているのですが、OfficeのVerに依存する場合があるのと
基本的に複数のOffice製品がインストールされている状態を防ぎたいので
事前の環境確認としてインストール状態の調査が必要になっています。
引用返信 編集キー/
■52346 / inTopicNo.13)  Re[7]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ aetos (322回)-(2010/08/06(Fri) 13:05:05)
No52344 (まぐねしうむ さん) に返信
> 2010/08/06(Fri) 11:31:18 編集(投稿者)
>
> ■No52328 (渋木宏明 さん) に返信
>
>>どの時点でのチェックですか?
>>アドインのインストール時にチェックしようという目論見なら、あまり効果はなさそうな気が。
>>アドインをインストールした後に、Office のインストール状況なんてなんぼでも変化しますよね?
> C#からOffice製品をたたくコードを書いているのですが、OfficeのVerに依存する場合があるのと
> 基本的に複数のOffice製品がインストールされている状態を防ぎたいので
> 事前の環境確認としてインストール状態の調査が必要になっています。

Office って複数インストールできましたっけ?
引用返信 編集キー/
■52347 / inTopicNo.14)  Re[8]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ (107回)-(2010/08/06(Fri) 13:07:40)
No52346 (aetos さん) に返信

ちゃんと古いバージョンからインストールすれば可能です。
http://www.atmarkit.co.jp/fwin2k/win2ktips/847office/office.html
引用返信 編集キー/
■52355 / inTopicNo.15)  Re[7]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ 渋木宏明 (28回)-(2010/08/06(Fri) 14:57:47)
渋木宏明 さんの Web サイト
> 事前の環境確認としてインストール状態の調査が必要になっています。

その「事前」というのがいつなんでしょう?

自作アプリケーションのインストール時にチェックを実行するのであれば、自作アプリケーションのインストール後に Office のインストール状況はいくらでも変化します。

あるいは、自作アプリケーションの起動時にチェックしたい、というこですか?

その場合、対応する Office のバージョンは固定ですか?

それとも、インストールされている Office の中で最新のもの使いたいとか?


引用返信 編集キー/
■52357 / inTopicNo.16)  Re[8]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ (108回)-(2010/08/06(Fri) 15:35:15)
No52355 (渋木宏明 さん) に返信
> その「事前」というのがいつなんでしょう?
自作アプリケーションの起動時になります。

> その場合、対応する Office のバージョンは固定ですか?
Office2000以降を想定しています。


引用返信 編集キー/
■52364 / inTopicNo.17)  Re[9]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ 渋木宏明 (29回)-(2010/08/06(Fri) 18:37:33)
渋木宏明 さんの Web サイト
>>その場合、対応する Office のバージョンは固定ですか?
> Office2000以降を想定しています。

Office 2000 以降の Office が複数バージョンインストールされていた場合、どういう振る舞いをさせたいですか?

常に最新版の Office を相手に動けばいいですか? あるいは、自作アプリケーション開発時点で出荷済みの Office の中で最新のものを相手にします?

また、アプリケーションから Office アプリケーションを操作しているとのことですが、その際に使っている技術はなんでしょう? Office PIA を使ってたりしますか?
引用返信 編集キー/
■52368 / inTopicNo.18)  Re[10]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ (109回)-(2010/08/06(Fri) 19:36:15)
No52364 (渋木宏明 さん) に返信
> Office 2000 以降の Office が複数バージョンインストールされていた場合、どういう振る舞いをさせたいですか?
動作ない恐れがあると言うメッセージを出力し、OKなら最新のOfficeを起動したいと考えています。
(ココの動きはファイルの関連付けから、最後に起動したOfficeになるかもしれません。)

> 常に最新版の Office を相手に動けばいいですか? あるいは、自作アプリケーション開発時点で出荷済みの Office の中で最新のものを相手にします?
出荷時(今ならOffice2010)までを相手にします。
仮にOffice2012が出た場合は、その際自作側プログラムを変更する予定です。

> また、アプリケーションから Office アプリケーションを操作しているとのことですが、その際に使っている技術はなんでしょう? Office PIA を使ってたりしますか?
Office2000の場合は遅延、それ以降はPIAになる予定です。
引用返信 編集キー/
■52377 / inTopicNo.19)  Re[11]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ 渋木宏明 (30回)-(2010/08/06(Fri) 21:38:37)
渋木宏明 さんの Web サイト
>>常に最新版の Office を相手に動けばいいですか? あるいは、自作アプリケーション開発時点で出荷済みの Office の中で最新のものを相手にします?
> 出荷時(今ならOffice2010)までを相手にします。
> 仮にOffice2012が出た場合は、その際自作側プログラムを変更する予定です。

現状がどうであるかは別として、希望する動作は「自アプリケーション出荷時点の最新の Office を利用したい」ということですね?

>>また、アプリケーションから Office アプリケーションを操作しているとのことですが、その際に使っている技術はなんでしょう? Office PIA を使ってたりしますか?
> Office2000の場合は遅延、それ以降はPIAになる予定です。

であれば、事前チェックでは、自作アプリケーションで使用する可能性のあるバージョン付き ProgID を見ればいいんじゃないでしょうか。

遅延バインドだろうと PIA だろうと、結局は Office 製品をオートメーション起動することになるので、オートメーション関連のレジストリエントリを見たほうが確実と思います。



引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -