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

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

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

Re[6]: Process.Startメソッドの引数について


(過去ログ 70 を表示中)

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

■40842 / inTopicNo.1)  Process.Startメソッドの引数について
  
□投稿者/ らんぺるーる (108回)-(2009/09/04(Fri) 11:47:32)

分類:[.NET 全般] 

Process.Start メソッド (String)の引数について、
「プロセスで実行する文書またはアプリケーション ファイルの名前。 」
とmsdnに記載がされております。

ただし、環境変数のPASSに登録されているフォルダに格納されている
アプリケーション以外については、ファイル名のみでは、
ファイルの場所がわからず、起動することができません。

そこで、対処としては以下の2点が考えられます。
@環境変数のPASSに、起動したいアプリケーションのパスを追加する。
A引数にファイル名ではなくファイルのパスを指定する。

呼び出し先のアプリケーションも独自で作成したexeファイルであり、
呼び出し元のアプリケーションと一緒に配布するため、今回は
Aの対処をおこなおうと考えておりました。
ところが、別の対処として(理論はわかりませんが)
呼び出し元のアプリケーションと同じフォルダに呼び出し先の
アプリケーションを配置したところ、ファイル名のみでも
呼び出しができることを確認しました。
(呼び出し元のアプリケーションからの相対パスとしても
指定できるということでしょうか?)

ところが、毎回呼び出しに成功するわけでなく、動作が不安定です。
上記について、何かご存知の方がいらっしゃいましたら教えていただけないでしょうか。


引用返信 編集キー/
■40846 / inTopicNo.2)  Re[1]: Process.Startメソッドの引数について
□投稿者/ 魔界の仮面弁士 (1268回)-(2009/09/04(Fri) 12:53:50)
No40842 (らんぺるーる さん) に返信
> 環境変数のPASSに、起動したいアプリケーションのパスを追加する。
PASS ではなく、PATH に登録する必要があります。

> アプリケーション以外については、ファイル名のみでは、
> ファイルの場所がわからず、起動することができません。
PATH すら無い場合、複数のフォルダに同じファイル名があった場合に、
どれを採用するべきかという優先順位付けができなくなってしまいます。

> 引数にファイル名ではなくファイルのパスを指定する。
これが無難かと。
同一ドライブであれば、カレントからの相対パス指定でも良いのかな。

> 呼び出し元のアプリケーションと同じフォルダに呼び出し先の
> アプリケーションを配置したところ、ファイル名のみでも
> 呼び出しができることを確認しました。
カレント ドライブとカレント ディレクトリが、たまたま
アプリケーション フォルダになっていたのでは?
引用返信 編集キー/
■40850 / inTopicNo.3)  Re[2]: Process.Startメソッドの引数について
□投稿者/ らんぺるーる (109回)-(2009/09/04(Fri) 14:14:25)
No40846 (魔界の仮面弁士 さん) に返信
> PASS ではなく、PATH に登録する必要があります。
訂正有難うございます。

>>アプリケーション以外については、ファイル名のみでは、
>>ファイルの場所がわからず、起動することができません。
> PATH すら無い場合、複数のフォルダに同じファイル名があった場合に、
> どれを採用するべきかという優先順位付けができなくなってしまいます。
PATHに指定されていないフォルダについてもファイルを検索してくれるのでしょうか?
PATHに指定されたフォルダのみを対象に検索してくれるものと
思っておりました。
(PATHに指定されている複数のフォルダに同じ名称のファイルがあった場合は
どれを起動するのでしょうかね…。そのような環境はないとは思いますが。)

>>引数にファイル名ではなくファイルのパスを指定する。
> これが無難かと。
了解致しました。この対処をおこなおうと思います。

> 同一ドライブであれば、カレントからの相対パス指定でも良いのかな。
先述のとおり、同じフォルダに格納しましたが、毎回呼び出しが
うまくいくわけではありませんでした。
相対パスは使用しないほうがいいのではないかと考えております。

>>呼び出し元のアプリケーションと同じフォルダに呼び出し先の
>>アプリケーションを配置したところ、ファイル名のみでも
>>呼び出しができることを確認しました。
> カレント ドライブとカレント ディレクトリが、たまたま
> アプリケーション フォルダになっていたのでは?
アプリケーション フォルダの意味を知らなかったので調べたところ、
「Program Files フォルダの下にあるアプリケーション用フォルダ。通常は C:\Program Files\Company Name\App Name」
とありました。
今回試験をした環境では「Program Files」以下には格納しておりませんでした。
デスクトップにフォルダを作成して格納しております。
引用返信 編集キー/
■40863 / inTopicNo.4)  Re[3]: Process.Startメソッドの引数について
□投稿者/ 魔界の仮面弁士 (1269回)-(2009/09/04(Fri) 17:39:34)
No40850 (らんぺるーる さん) に返信
>>>アプリケーション以外については、ファイル名のみでは、
>>>ファイルの場所がわからず、起動することができません。
>>PATH すら無い場合、複数のフォルダに同じファイル名があった場合に、
>>どれを採用するべきかという優先順位付けができなくなってしまいます。
> PATHに指定されていないフォルダについてもファイルを検索してくれるのでしょうか?
済みません、言葉が足りませんでした。(検索処理時の手順の話をしようとしたつもりでした)

環境変数 PATH から検索される場合、そこに記録されている順番にも実は意味があります。
Windows は基本的に、パスの登録順にプログラムを検索しますので、アプリによっては、
PATH 内の順番を変えると動作しない物も存在しています。

そしてこれが、先の発言における「優先順位」という言葉の意味となっています。


> PATHに指定されたフォルダのみを対象に検索してくれるものと
> 思っておりました。
Process.Start には、PATH 以外の任意の場所から検索実行させる機能はありませんので、
もしも PATH 以外からも実行させたいのであれば、それぞれのディレクトリを走査するための
仕組みを実装し、それを絶対パスに変換して渡す必要があります。

そして検索機能を独自実装する場合、それぞれのディレクトリをどの順番で走査するかによって、
複数の同名ファイルに対する優先順位付けが変わってきますよね。ですから、PATH に相当する
「検索順」を定義するための仕組みを、御自身で定義しなければなりませんね、というのが
先の発言の意図です。失礼しました。


> (PATHに指定されている複数のフォルダに同じ名称のファイルがあった場合は
実際に試してみてください。

> どれを起動するのでしょうかね…。そのような環境はないとは思いますが。)
や、同名ファイルが配置されるのは、さして珍しい話では無いと思いますよ。

ただ、厳密に言うと、参照されるのは PATH だけではありません。
先述したように、カレント ディレクトリも走査対象となります。
(ついでに言うと、実行に際してはレジストリ内の情報も利用されています)

なお、Process.Start の動作は、ShellExecuteEx APIに準じた物となっています。
(なので、パス長の 2000文字制限などもそのまま引き継がれていたりする…)


>>同一ドライブであれば、カレントからの相対パス指定でも良いのかな。
> 先述のとおり、同じフォルダに格納しましたが、毎回呼び出しが
> うまくいくわけではありませんでした。
“同じフォルダに配置する”のではなく、“カレントディレクトリに配置”してみてください。

……というよりは、“配置したディレクトリをカレントにする”、の方が表現としては正しいかな。


>>> 呼び出し元のアプリケーションと同じフォルダに呼び出し先の
>>> アプリケーションを配置したところ、ファイル名のみでも
>>> 呼び出しができることを確認しました。
>> カレント ドライブとカレント ディレクトリが、たまたま
>> アプリケーション フォルダになっていたのでは?
> アプリケーション フォルダの意味を知らなかったので調べたところ、

先の「アプリケーション フォルダ」とは、らんぺるーるさんの発言にある
>>> 呼び出し元のアプリケーションと同じフォルダに
を指した言葉であって、特定の用語というわけではありません。
(「カレント ドライブ」や「カレント ディレクトリ」という用語ならばありますけれども)

ここでいう「アプリケーション フォルダ」とは、大雑把に言えば
「exe 本体の置いてあるディレクトリ」を指していると思っておいてください。
(VB6 では、俗に "App.Path" などと呼ばれる場所です)


> 「Program Files フォルダの下にあるアプリケーション用フォルダ。通常は C:\Program Files\Company Name\App Name」
> とありました。
これは、アプリのインストール先として、その場所が一般的に使われているという事です。
実際には、C:\Program Files\Product Name の形式も多いですけれどね。

> 今回試験をした環境では「Program Files」以下には格納しておりませんでした。
> デスクトップにフォルダを作成して格納しております。
「exe 本体の置いてあるディレクトリ」は、どこであっても構いません。
もちろん、デスクトップでも OK です。

重要なのは、あくまでカレント ディレクトリです。
引用返信 編集キー/
■40867 / inTopicNo.5)  Re[4]: Process.Startメソッドの引数について
□投稿者/ Jitta on the way (421回)-(2009/09/04(Fri) 19:13:55)
No40863 (魔界の仮面弁士 さん) に返信
> なお、Process.Start の動作は、ShellExecuteEx APIに準じた物となっています。
> (なので、パス長の 2000文字制限などもそのまま引き継がれていたりする…)

確認してないので、いい加減なこと言うかもですが。
カレント ディレクトリ、呼び出し元アプリケーションが存在しているディレクトリ、システム ディレクトリ、Windows ディレクトリも、検索の対象になりませんか?


# レジストリ App Paths をつかうのは、なんだっけ?
引用返信 編集キー/
■40870 / inTopicNo.6)  Re[5]: Process.Startメソッドの引数について
□投稿者/ 魔界の仮面弁士 (1271回)-(2009/09/04(Fri) 19:29:43)
No40867 (Jitta on the way さん) に返信
> カレント ディレクトリ、呼び出し元アプリケーションが存在しているディレクトリ、システム ディレクトリ、Windows ディレクトリも、検索の対象になりませんか?
LoadLibrary API や VB の Declare ステートメントは、それらも対象としていますね。
Process クラスはどうなのかな…(調べていません)。


> # レジストリ App Paths をつかうのは、なんだっけ?
ShellExecute とか。(Ex もかな?)

KB837633 を見ると、ShellExecute における App Paths の優先順位は、
環境変数 PATH の次であるかのようにも読めますが…こちらも調べていません。
引用返信 編集キー/
■40909 / inTopicNo.7)  Re[4]: Process.Startメソッドの引数について
□投稿者/ らんぺるーる (110回)-(2009/09/07(Mon) 10:19:06)
No40863 (魔界の仮面弁士 さん) に返信


分かりやすい説明有難うございます。
内容について理解することができました。

プログラム上において、どのフォルダがカレントディレクトリとして
扱われるのかは、知識がなかったので調べてみます。

動作が不安定な理由については、
アプリケーション起動時はアプリケーションが格納されているフォルダが
カレントディレクトリとなっているため、同じフォルダに配置した
アプリケーションを相対パスで呼びだせますが、

何かの処理を行った際に、カレントディレクトリが他のフォルダに設定され、
アプリケーションが呼び出せなくなったのだと思います。

上記から「呼び出し元アプリケーションが存在しているディレクトリ」は
検索対象外なのではないかと推測しております。







引用返信 編集キー/
■40918 / inTopicNo.8)  Re[5]: Process.Startメソッドの引数について
□投稿者/ 魔界の仮面弁士 (1273回)-(2009/09/07(Mon) 13:49:28)
No40909 (らんぺるーる さん) に返信
> プログラム上において、どのフォルダがカレントディレクトリとして
> 扱われるのかは、知識がなかったので調べてみます。

カレント ディレクトリは、ドライブごとにそれぞれ存在しています。

ショートカットのプロパティでいうところの「作業フォルダ」は、アプリケーションの
起動直後における「カレント ドライブ上のカレント ディレクトリ」を指しています。


> 何かの処理を行った際に、カレントディレクトリが他のフォルダに設定され、
> アプリケーションが呼び出せなくなったのだと思います。

カレントディレクトリは、ユーザー操作(ファイルを開く/保存のダイアログなど)によって
変更される可能性があります。また、プログラムから変更する事も可能です。
たとえば、VB.NET であれば、このように書けます。

 ChDrive("C")  'カレント ドライブを C: にする。
 CurDir("C:\Program Files\") 'カレント ディレクトリを C:\Program Files にする。

 '現在のディレクトリ位置を確認する。
 Dim d1 As String = CurDir()
 Dim d2 As String = My.Computer.FileSystem.CurrentDirectory


Windows アプリケーションの場合、現在のカレントディレクトリ位置は
ユーザーには把握しにくいですし、アプリケーションの内部処理としては、
常に絶対パスとして処理させるようにした方が良いでしょうね。
引用返信 編集キー/
■40923 / inTopicNo.9)  Re[6]: Process.Startメソッドの引数について
□投稿者/ らんぺるーる (111回)-(2009/09/07(Mon) 14:44:31)
No40918 (魔界の仮面弁士 さん) に返信
詳しい説明、有難うございました。
プログラム上では、絶対パスにて指定をおこなうよう
修正したところ、きちんと呼び出せるようになりました。

解決済みとさせていただきます。
本当にありがとうございました。
解決済み
引用返信 編集キー/
■40938 / inTopicNo.10)  Re[5]: Process.Startメソッドの引数について
□投稿者/ Jitta on the way (425回)-(2009/09/07(Mon) 19:17:38)
No40867 (Jitta on the way さん) に返信
> 呼び出し元アプリケーションが存在しているディレクトリ

これは、LoadLibrary でした。失礼しました。



Process.Start(string) は、スタート メニューの「ファイル名をしてして実行」と同じで、これは ShellExecute と同じということでした。
魔界の仮面弁士さんの出されている kb は、「正しい動作は、App Paths → 環境変数 PATH」と書いてあるように思います。しかし、その他の検索場所については、わかりませんでした。
解決済み
引用返信 編集キー/
■40962 / inTopicNo.11)  Re[6]: Process.Startメソッドの引数について
□投稿者/ らんぺるーる (112回)-(2009/09/08(Tue) 10:56:14)
No40938 (Jitta on the way さん) に返信
> ■No40867 (Jitta on the way さん) に返信
>>呼び出し元アプリケーションが存在しているディレクトリ
>
> これは、LoadLibrary でした。失礼しました。
>
>
>
> Process.Start(string) は、スタート メニューの「ファイル名をしてして実行」と同じで、これは ShellExecute と同じということでした。
> 魔界の仮面弁士さんの出されている kb は、「正しい動作は、App Paths → 環境変数 PATH」と書いてあるように思います。しかし、その他の検索場所については、わかりませんでした。

「ファイル名をしてして実行」
→なんか、かわいいタイプミスですね♪
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -