- PR -

CreateProcessでエラー

1
投稿者投稿内容
ナヲ
常連さん
会議室デビュー日: 2004/02/25
投稿数: 32
投稿日時: 2006-11-21 18:20
VB.NET(2003)で、別exeを起動し、終了まで待機するということをするために、
system.Diagnostics.Processクラスを使用していました。

しかし、実際に動かす環境がMetaFrameで、ユーザー権限の関係で
このクラスは使用できないようで画面の起動すらできなくなります。

ですので、APIのCreateProcess、WaitForSingleObjectを使用するように
変更したいのですが、下記の用に使用すると、
CreateProcessのところで、
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
の例外となってしまいます。
どのインスタンスを作成する必要があるのでしょうか?


Public Structure PROCESS_INFORMATION
  Public hProcess As Integer
  Public hThread As Integer
  Public dwProcessId As Integer
  Public dwThreadId As Integer
End Structure

Public Structure STARTUPINFO
  Public cb As Integer
  Public lpReserved As String
  Public lpDesktop As String
  Public lpTitle As String
  Public dwX As Integer
  Public dwY As Integer
  Public dwXSize As Integer
  Public dwYSize As Integer
  Public dwXCountChars As Integer
  Public dwYCountChars As Integer
  Public dwFillAttributes As Integer
  Public dwFlags As Integer
  Public wShowWindow As Short
  Public cbReserved2 As Short
  Public lpReserved2 As Short
  Public hStdInput As Integer
  Public hStdOutput As Integer
  Public hStdError As Integer
End Structure


Declare Function CreateProcess Lib "kernel32.dll" Alias "CreateProcessA" _
(ByVal lpApplicationName As String, _
 ByVal lpCommandLine As String, _
 ByVal lpProcessAttributes As Long, _
 ByVal lpThreadAttributes As Long, _
 ByVal bInheritHandles As Integer, _
 ByVal dwCreateionFlags As Integer, _
 ByVal lpEnvironment As Integer, _
 ByVal lpCurrentDirectory As String, _
 ByVal lpStartupInfo As STARTUPINFO, _
 ByVal lpProcessInformation As PROCESS_INFORMATION) As Integer

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim pi As PROCESS_INFORMATION
    Dim si As STARTUPINFO

    Dim result As Integer = CreateProcess("c:/test.exe", "", 0, 0, 0, 0, 0, "", si, pi)

    ・・・
End Sub

以上、よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-21 19:54
定義も含め、何かと間違えていませんか。ご確認ください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-11-21 23:58
引用:

ナヲさんの書き込み (2006-11-21 18:20) より:
ですので、APIのCreateProcess、WaitForSingleObjectを使用するように



MetaFrameってプログラムが起動できない。。。
そうなのでしょうか?MetaFrame知らないので断言はしませんが。。。

ちなみにCreateProcess()のImpersonateでも使うのでしょうか。
ってWIN32APIの偽装も怪しくて好きではありませんが。

引用:

 Dim result As Integer = CreateProcess("c:/test.exe", "", 0, 0, 0, 0, 0, "", si, pi)



それだとsystem.Diagnostics.Processと同じなのでは。。。
そういう問題じゃない??

ナヲ
常連さん
会議室デビュー日: 2004/02/25
投稿数: 32
投稿日時: 2006-11-24 13:30
>じゃんぬねっと さま
ありがとうございます。
某サイトで、VB.NETでのCreateProcessの宣言方法として、
本文に記載したような方法になっていたので、真似をしてました。
根本的にダメということなのですね?
勉強になりました。

>加納正和 さま
MetaFrameを介さなければ使えていたので、
当初はMetaFrameのせいだと考えていたのですが、権限の関係だったようです。
system.Diagnostics.Processは、管理者権限じゃないと使えないようなので。
権限がらみのところは、当方は触ることができないので、
CreateProcessで代替しようと考えました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-24 15:20
引用:

ナヲさんの書き込み (2006-11-24 13:30) より:

某サイトで、VB.NETでのCreateProcessの宣言方法として、本文に記載したような方法になっていたので、真似をしてました。


なるほど、下記リンク先でそのように教示を受けたのですね。そういうことは、最初に書いておいた方が (ご自身も回答者も) 楽になると思いますよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-11-24 15:31
>system.Diagnostics.Processは、管理者権限じゃないと使えないようなので。

Process クラスを使って「やる事」によりますが、必ずしも「管理者権限が必要」ということはありません。

Process クラスも最終的には CreateProcess や ShellExecuteEx 辺りの API を呼び出しているので、問題を解決するためには、きちんと原因を究明することが第一だと思います。
1

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