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 |