@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

レジストリへのアクセス

投稿者投稿内容
未熟者
常連さん
会議室デビュー日: 2006/08/12
投稿数: 20
投稿日時: 2006-09-12 11:55
VB.NET上でEXCELを使用しているのですが、メモリ上に複数起動したりするので現在は下記のようにプロセスをKillしているのですが、EXCElのフルパスを指定する際に他のOFFICEのバージョンだと動かないことが判明しました、そこでレジストリにEXCELのフルパスが登録されているはずなのでそこからフルパスを取得すればバージョンに関係なく実行できると思っています。
 つきまして、レジストリの中の特定ファイルのパスを取得する方法かバージョンによってフルパスを取得する他の方法がありましたらご教授ください。よろしくお願いします。

使用バージョンffice 2000

Public Shared Function GetPreviousProcess() As Process
Dim curProcess As Process = Process.GetCurrentProcess
Dim allProcesses() As Process = Process.GetProcessesByName("Excel")

Dim checkProcess As Process

For Each checkProcess In allProcesses
If checkProcess.Id <> curProcess.Id Then
If String.Compare( _
checkProcess.MainModule.FileName, _


"C:\Program Files\Microsoft Office\OFFICE\EXCEL.EXE", True) = 0 Then

Return checkProcess
End If
End If
Next

Return Nothing
End Function

While (1)
If hProcess Is Nothing Then
Exit While
End If
hProcess.Kill()

System.Threading.Thread.Sleep(1500)

hProcess = GetPreviousProcess()
End While
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-09-12 12:22
引用:

未熟者さんの書き込み (2006-09-12 11:55) より:

つきまして、レジストリの中の特定ファイルのパスを取得する方法かバージョンによってフルパスを取得する他の方法がありましたらご教授ください。


"バージョンが同一であれば、パスが同一" などという保証はありません。
ですので、レジストリを参照してパスを取得する方法になります。

まずは、Microsoft.Win32.RegistryKey クラスあたりを調べてください。

引用:

メモリ上に複数起動したりするので


の意味が良くわかりませんでしたが、
すでに起動済みの Excel の Workbooks 内に展開したくないという意味でしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未熟者
常連さん
会議室デビュー日: 2006/08/12
投稿数: 20
投稿日時: 2006-09-12 13:08
返答ありがとうございます、複数起動の意味はそのとおりです、関数に関してはしらべてみます。ありがとうございます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-09-12 13:54
引用:

未熟者さんの書き込み (2006-09-12 13:08) より:

返答ありがとうございます、複数起動の意味はそのとおりです、


Workbook 内に展開せず新しく起動することに関しては、VSTO / Office PIA あたりでも解決します。
起動するだけであれば、こういう手もあるという以上の意味はございませんが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未熟者
常連さん
会議室デビュー日: 2006/08/12
投稿数: 20
投稿日時: 2006-09-12 14:03
Microsoft.Win32.RegistryKey クラス調べて一応作ってみました。

Dim Key As String = "SOFTWARE\Microsoft\Office\9.0\EXCEL\InstallRoot"
Dim Value As String = "Path"

' レジストリの取得
Try
Dim rKey As RegistryKey = Registry.LocalMachine.OpenSubKey(Key)

Dim location As String = CStr(rKey.GetValue(Value))

rKey.Close()
Catch ex As NullReferenceException

End Try

が、これでは意味がないので"SOFTWARE\Microsoft\Office\9.0\EXCEL\InstallRoot"
の9.0の部分を*にしたいのですがこの場合は使えません。何かいい方法ないでしょうか?
よろしくお願いします。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-09-12 14:26
リファレンス見ようぜ。
GetSubKeyNamesで検索すればいいんじゃないの?
拡張子規定のとなるとSOFTWARE\Microsoft\Office\9.0\EXCEL\InstallRootあたりを調べるんじゃなくてShell周りを調べた方がいいんじゃないかね。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-09-12 14:52
こんにちは。

確かに HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\9.0\EXCEL\InstallRoot
あたりには Office の情報が登録されているようですね。ただ、未熟者さんの懸
念されているように、必ずしも 9.0 とは限らないわけで。
(ちなみに私の PC では Office2003 なので 11.0 に登録されていました)

キーに関してはぶさいくろうさんの仰るように GetSubKeyNames で検索する
方法もありますし、Shell 周りを調べるという方法もあります(むしろこちらの方
が楽そうです)。

流れとしてはこんな感じでしょうかね。

HKEY_CLASSES_ROOT\.xls の (既定) の値を調べる
# 私の PC では Excel.Sheet.8 になっていました

HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\command あたりを調べてみる
# Excel.Sheet.8 は上で取得した名前です

Excel のフルパスが入っているので、それを起動
# "C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" /e となっていたので
# ダブルクォートの中身だけを取り出すといいかもしれません

(゚Д゚)ウマー

また、じゃんぬねっとさんが以下のようなヒントを与えてくださっていますので、
VSTO / Office PIA についても調べてみるといいかもしれませんね。
(未熟者さんの目的だとこちらの方がいいかもしれないですし)

引用:

じゃんぬねっとさんの書き込み (2006-09-12 13:54) より:

Workbook 内に展開せず新しく起動することに関しては、VSTO / Office PIA あたりでも解決します。
起動するだけであれば、こういう手もあるという以上の意味はございませんが...


_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
未熟者
常連さん
会議室デビュー日: 2006/08/12
投稿数: 20
投稿日時: 2006-09-12 15:44
ぶさいくろうさん、ぽぴ王子さん返答ありがとうございます。
shell周りを調べたのですが私のPCの場合

HKEY_CLASSES_ROOT\.xls の (既定) の値を調べる
# Excel.Sheet.8

HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\command あたりを調べてみる
# ここで私のPCの場合Excel.Sheet.8以下にはShellNewしかありませんでした。

GetSubKeyNamesに関しましては、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\以下のものを抽出しましたが、私のPCの場合10.0 8.0 9.0 Excel OutLook等が出てきました。たしかに、前回でてきた10.0や9.0を新たなGetSubKeyNamesの条件に付加すればその下にExcelが入っていたのは9.0だけでしたのでうまく条件を抽出できるとおもいます。

VSTO / Office PIA に関しては調べてみます。

ご意見ありがとうございます。

スキルアップ/キャリアアップ(JOB@IT)