VB-Homepage Tipp 390

Fremdprogramme aus VB heraus starten - CreateProcessBynum

Das Sie Fremdprogramme aus VB heraus starten können, daß wissen Sie mit Sicherheit, gibt es dafür doch den Shell Befehl und der bietet ja auch einige Optionen für das zu startende Programm.

Aber irgenwo hört es eben auf und genau da fängt dieser Tipp an.

Erstens, können Sie mit dem Shell Befehl zwar ein Minimiert, Maximiert oder
Normal als Fenstergröße angeben, aber Einfluß auf die direkten Koordinaten für das zu startende Programm oder die Größenangabe des Fensters haben Sie nicht.

Zweites, und wie ich finde genau so interessant, haben Sie mit dem Shell Befehl keinen Einfluß auf die Programm Priorität. Sicher haben Sie zumindestens schon davon gehört, daß Programme unterschiedliche Prioritäten besitzen, die höchste ist die Realtime, Echtzeit oder auch zeitkritische Programme genannt.

Und beide der hier angegebenen Eigenschaften sind mit nachfolgenden Tipp realisierbar.

1.
Für ein Demoprojekt benötigen Sie eine Form mit einem Commandbutton
(Command1), der später die Programmaktion ausführen soll.

2.
Allgemein/Deklarationen

Private Type STARTUPINFO
   cb As Long
   lpReserved As String
   lpDesktop As String
   lpTitle As String
   dwX As Long
   dwY As Long
   dwXSize As Long
   dwYSize As Long
   dwXCountChars As Long
   dwYCountChars As Long
   dwFillAttribute As Long
   dwFlags As Long
   wShowWindow As Integer
   cbReserved2 As Integer
   lpReserved2 As Long
   hStdInput As Long
   hStdOutput As Long
   hStdError As Long
End Type

Private Type PROCESS_INFORMATION
   hProcess As Long
   hThread As Long
   dwProcessId As Long
   dwThreadId As Long
End Type

Const NORMAL_PRIORITY_CLASS = &H20
Const IDLE_PRIORITY_CLASS = &H40
Const HIGH_PRIORITY_CLASS = &H80
Const REALTIME_PRIORITY_CLASS = &H100

Const STARTF_USEPOSITION& = &H4
Const STARTF_USESIZE& = &H2
Const VNS = vbNullString

Private Declare Function CreateProcessBynum& Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName$, ByVal lpCommandLine$, ByVal lpProcessAttributes&, ByVal lpThreadAttributes&, ByVal bInheritHandles&, ByVal dwCreationFlags&, lpEnvironment As Any, ByVal lpCurrentDirectory$, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION)

3.
Command1_Click

Dim X&, Y&, SX&, SY&
Dim ExeFile$, BZP$
Dim sinfo As STARTUPINFO, pinfo As PROCESS_INFORMATION

'Größenangaben für Fenster
X& = 100     'Left
Y& = 100     'Top
SX& = 400   'Width
SY& = 250   'Height

With sinfo
   .cb = Len(sinfo)
   .lpReserved = VNS
   .lpDesktop = VNS
   .lpTitle = VNS
   .dwX = X
   .dwY = Y
   .dwXSize = SX
   .dwYSize = SY
   .dwFlags = STARTF_USEPOSITION Or STARTF_USESIZE
End With

ExeFile$ = "notepad.exe"       'Pfad
BZP$ = ""                            'Startparameter

Call CreateProcessBynum(VNS, ExeFile$ & " " & BZP$, 0, 0, False, NORMAL_PRIORITY_CLASS, 0, VNS, sinfo, pinfo)

4.
Damit ist es schon genug der Angaben.
Wenn Sie jetzt das Programm starten und den Button anklicken, wird das Notepad Fenster mit den Koordinaten 100 Bp von Links und 100 Bp von Oben,
sowie die Fenstergröße mit 400 Bp Breit und 250 Bp Hoch geöffnet.

Wenn Sie es mit anderen Programmen testen möchten, ggf. mit einem selbsterstellten, dann sollten Sie beim Erstellen darauf achten, daß die Form Eigenschaft STARTUPPOSITION auf Windows-Standard steht.

5.
Nun aber noch zur Priorität, wenn Sie sich den Aufruf ansehen, dann erkennen Sie, daß einer der übergebenen Werte NORMAL_PRIORITY_CLASS lautet.
Das Programm wird also mit normaler Priorität gestartet.
Wenn Sie die Constante austauschen, können Sie für Ihr Programm die
Prio selbst festlegen.

NORMAL_PRIORITY_CLASS           ' normal / Standard
IDLE_PRIORITY_CLASS                 ' Leerlauf / niedrig
HIGH_PRIORITY_CLASS                ' hoch
REALTIME_PRIORITY_CLASS        ' Echtzeit

Zum Testen könnten Sie sich ja ein Programm schreiben, das durch einen Timer immer nur eine Variable um eins hochzählt und dies in ein Label Objekt ausgibt.
Label1.Caption = Val(Label1.Caption) + 1
Dieses rufen Sie dann jeweils mit den vier Priorität hintereinander auf und Sie werden sehen, daß diese Prioritäten sehr wohl Einfluß haben,
wieviel Rechnerleistung das Programm bekommt,
besonders bei Idle ist dies sehr gut zu sehen.

Tipp-Download

Quelle : Jürgen Thümmler / www.basicworld.com

Zurück zur Übersichtsseite