- - PR -
レジストリへのアクセス
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 | ||||||||
|
投稿日時: 2006-09-12 12:22
"バージョンが同一であれば、パスが同一" などという保証はありません。 ですので、レジストリを参照してパスを取得する方法になります。 まずは、Microsoft.Win32.RegistryKey クラスあたりを調べてください。
の意味が良くわかりませんでしたが、 すでに起動済みの Excel の Workbooks 内に展開したくないという意味でしょうか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-09-12 13:08
返答ありがとうございます、複数起動の意味はそのとおりです、関数に関してはしらべてみます。ありがとうございます。
| ||||||||
|
投稿日時: 2006-09-12 13:54
Workbook 内に展開せず新しく起動することに関しては、VSTO / Office PIA あたりでも解決します。 起動するだけであれば、こういう手もあるという以上の意味はございませんが... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 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の部分を*にしたいのですがこの場合は使えません。何かいい方法ないでしょうか? よろしくお願いします。 | ||||||||
|
投稿日時: 2006-09-12 14:26
リファレンス見ようぜ。
GetSubKeyNamesで検索すればいいんじゃないの? 拡張子規定のとなるとSOFTWARE\Microsoft\Office\9.0\EXCEL\InstallRootあたりを調べるんじゃなくてShell周りを調べた方がいいんじゃないかね。 | ||||||||
|
投稿日時: 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 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 に関しては調べてみます。 ご意見ありがとうございます。 |