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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.52275 の関連記事表示

<< 0 >>
■52275  64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ -(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());
    }

    よろしくお願いします。
親記事 /過去ログ88より / 関連記事表示
削除チェック/

■52276  Re[1]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ よねKEN -(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で実際のレジストリの位置を確認してみてはどうでしょうか?
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

■52279  Re[2]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ Azulean -(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修正。
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

■52289  Re[2]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ -(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だと思うのですが
    何か良い手は無いでしょうか?

記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

■52298  Re[3]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ 中博俊 -(2010/08/05(Thu) 10:49:44)
    たぶんいい手は無いでしょうねぇ。
    そもそも何のためにレジストリ取得したいんですか?
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

■52301  Re[4]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ -(2010/08/05(Thu) 11:00:51)
    No52298 (中博俊 さん) に返信
    > たぶんいい手は無いでしょうねぇ。
    > そもそも何のためにレジストリ取得したいんですか?

    インストールされているOfficeの調査です。
    拡張子から実行されるEXEを取得する方法や、Officeアプリケーションを起動してバージョンを取得する方法も
    ありますが、それだと複数のOfficeがインストールされていた場合に1個しか取れないので
    レジストリからインストールされているパスを取得し、実際にそこにEXEがあるかを調査
    EXEがあればバージョンを取得しています。
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

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

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

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

    アドインをインストールした後に、Office のインストール状況なんてなんぼでも変化しますよね?
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

■52344  Re[6]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ -(2010/08/06(Fri) 11:29:36)
    2010/08/06(Fri) 11:31:18 編集(投稿者)

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

    > どの時点でのチェックですか?
    > アドインのインストール時にチェックしようという目論見なら、あまり効果はなさそうな気が。
    > アドインをインストールした後に、Office のインストール状況なんてなんぼでも変化しますよね?
    C#からOffice製品をたたくコードを書いているのですが、OfficeのVerに依存する場合があるのと
    基本的に複数のOffice製品がインストールされている状態を防ぎたいので
    事前の環境確認としてインストール状態の調査が必要になっています。
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

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

    Office って複数インストールできましたっけ?
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

■52347  Re[8]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ -(2010/08/06(Fri) 13:07:40)
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

■52355  Re[7]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ 渋木宏明 -(2010/08/06(Fri) 14:57:47)
>
    > 事前の環境確認としてインストール状態の調査が必要になっています。

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

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

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

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

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

記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

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

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

記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

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

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

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

    また、アプリケーションから Office アプリケーションを操作しているとのことですが、その際に使っている技術はなんでしょう? Office PIA を使ってたりしますか?
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

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

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

    > また、アプリケーションから Office アプリケーションを操作しているとのことですが、その際に使っている技術はなんでしょう? Office PIA を使ってたりしますか?
    Office2000の場合は遅延、それ以降はPIAになる予定です。
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

■52377  Re[11]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ 渋木宏明 -(2010/08/06(Fri) 21:38:37)
>
    >>常に最新版の Office を相手に動けばいいですか? あるいは、自作アプリケーション開発時点で出荷済みの Office の中で最新のものを相手にします?
    > 出荷時(今ならOffice2010)までを相手にします。
    > 仮にOffice2012が出た場合は、その際自作側プログラムを変更する予定です。

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

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

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

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


記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

■52304  Re[3]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ とっちゃん -(2010/08/05(Thu) 12:22:03)
>
    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 というフラグを追加してやると
    リダイレクトモードが切り替わります。

    使ったことがないので、どのフラグがどちらになるのか?などはわかりません。
    実際に試してみて確認してみてください。
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

■52305  Re[4]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ まぐねしうむ -(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 で確認してみたいと思います。
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

■52319  Re[5]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ Jitta on the way -(2010/08/05(Thu) 18:54:25)
    インストール情報からインストール場所を探せば良いのでは?
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/

■52327  Re[6]: 64BitOSでのOfficeレジストリの取得方法
□投稿者/ 渋木宏明 -(2010/08/06(Fri) 02:44:12)
>
    2010/08/06(Fri) 02:49:29 編集(投稿者)

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

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

    あと、Suite 系の製品だと、個々の製品のインストール状況までは MSI API から知ることはできないし。
記事No.52275 のレス /過去ログ88より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -