- - PR -
どなたか教えて下さい。VB.NET Process.Startメソッドの戻り値が取得できません。
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-10-23 04:09
どなたか教えて下さい。
VB.NETで次のようにProcess.StartメソッドのProcess型の戻り値を取得したいのですが、 受け取るProcess型prcPrc変数にはnothingしか戻ってきません。 ListBox1.Items(i)には"010メモ帳.lnk"などとショートカットファイルを格納しています。 メモ帳は起動しています。ダイナミックヘルプをいくら読んでも何が良くないのか わかりません。 Dim i As Integer Dim prcPrc As Process For i = 0 To ListBox1.Items.Count - 1 Step 1 prcPrc = Process.Start(ListBox1.Items(i)) intAplId(i) = prcPrc.Id Next i | ||||
|
投稿日時: 2004-10-23 13:34
まず、ソースファイルの先頭に
Option Strict On と書いてください。 で、本題ですが、Process.Start()の返り値は、「プロセスリソースが起動されなかった場合はnull参照」が返るようですが・・・・・ 本当にNothingが返ってきていますか? InvalidCastExceptionが出てループが実行されていないなんてことはないですよね。 | ||||
|
投稿日時: 2004-10-23 20:24
一郎さんへ
早速のアドバイスありがとうございます。 Option Strict On を追加しましたら、 prcPrc = Process.Start(ListBox1.Items(i)) で「System.ObjectからStringへの暗黙的な変換はできません」とでました。 ListBox1のItemsはドラッグアンドドロップで追加してまして、そのまま Process.Start()の引数にしているのが原因のようです。 でもデフォルトのOption Strict Offではメモ帳は起動していますので、そうでも ないような気もします。 まだ試していませんので、また連絡します。 とにかくはアドバイスありがとうございました。 | ||||
|
投稿日時: 2004-10-24 03:21
一郎さんへ
Option Strict Onで ListBox1.Items(i)にToString をたして prcPrc = Process.Start(ListBox1.Items(i).ToString) として試してみましたが、やはり戻り値を受け取るprcPrcは Nothingでした。 Process.Start()の引数はlnkファイル名でしたので、直接実行 ファイル名を指定して prcPrc = Process.Start("notepad.exe") としたら、しっかり戻り値を受け取りました。 どうやらlnkファイルがよろしくないようです。 そこでlnkファイルから実行ファイルのリンク先を取得しようとして WindowsScriptHostオブジェクトを調べているのですが、初めてで なかなか難解です。 一郎さん知っていましたら、アドバイス下さい。 それからどなた様もご存知でしたら宜しくお願いします。 | ||||
|
投稿日時: 2004-10-24 06:26
いや、だから、『InvalidCastExceptionが出てループが実行されていない』ってところですよ。Option Strict Onにすると、暗黙の型変換が行われなくなります。型変換は、すべて明示的に指示しなければなりません。そのため、offでは実行でき、onだと実行できなくなっているのです。で、おそらく、戻り値がキャストできないので、Nothingになっているのだと思います。 戻り値をObjectで受け、その型を表示し、その型で受ける(キャストする)ように修正してみてください。 _________________ | ||||
|
投稿日時: 2004-10-24 23:59
Jittaさんへ
解決策までものアドバイスありがとうございました。 そのとうり実行しましたが、やはり戻り値は Nothing でした。 コードは次のとおりです。 Dim objPrc As Object Dim prcPrc As Process Dim intAplId as Integer objPrc = Process.Start("c:\Documents and Settings\ysue\ _ デスクトップ\010メモ帳.lnk") prcPrc = CType(objPrc, Process) intAplId = prcPrc.Id objPrcも Nothing でした。 エラーメッセージは次のとおりでした。 'System.NullReferenceException' のハンドルされていない例外が 040GetMltiAplInfo.exe で発生しました。 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されて いません。 困りました。やはりlnkファイルがよろしくないように思いますが、いかがしょうか。 | ||||
|
投稿日時: 2004-10-25 06:52
.lnk のパス名に空白が含まれているのがよないのでは? パス名を " でくくってみてはどうでしょう。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||
|
投稿日時: 2004-10-26 21:25
ひどりさんへ
アドバイスありがとうございます。以前「CreatProcessでexplorer.exeが起動できない」 でもアドバイスをいただきましたysueです。 早速空白を除いて objPrc = Process.Start("c:\Documents and Settings\ysue\デスクトップ\010メモ帳.lnk") として試してみましたが、結果は同じでobjPrcはNothingでした。 lnkファイルの実行ファイルのリンク先が取得できれば解決するのですが。 lnkファイルで起動したプロセスは特別なんでしょうか。 lnkファイルはWindowsScriptHostで作成されたファイルのようでWindowsScriptHostオブジェクトを調べているのですが、うまくいきません。 アドバイス宜しくお願いします。 |