vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB & Windows API
Re: Rückgabewerte von ShellExecuteEx 
Autor: ModeratorMartoeng (Moderator)
Datum: 07.02.10 00:13

Hmm, VBA ist halt kein eigenständiges Programm. D.h. es wird wohl auch keinen eigenständigen MessageLoop haben usw. und das bringt einige komische Effekte mit sich wenn man mal etwas tiefer ins System eindringt. Kurze Frage: Warum ermittelst Du das eigentlich alles aus VBA heraus?


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Rückgabewerte von ShellExecuteEx 
Autor: stev-e87
Datum: 06.02.10 10:25

Hallo Vb' ler,

ich versuche ein Programm zu starten via ShellExecuteEx alà http://www.vbarchiv.net/api/details.php?id=shellexecuteex

mein dazugehöriger Code:
Dim Retval, prid As Long, ShExInfo As SHELLEXECUTEINFO
 
  ' Startoptionen festlegen
  With ShExInfo
    .cbSize = Len(ShExInfo)
    .fMask = SEE_MASK_FLAG_NO_UI Or SEE_MASK_CLASSNAME Or _
      SEE_MASK_NOCLOSEPROCESS
    .hwnd = Application.hwnd 'GetDesktopWindow()
    .lpVerb = "open"
    .lpFile = "I:\Portable\resource hacker\ResHacker.exe" 
    '.lpParameters
    '.lpDirectory = "c:\"
    .nShow = SW_SHOWNORMAL
  End With
 
  ' Programm ausführen
  Retval = ShellExecuteEx(ShExInfo)
  If Retval = 0 Then
 
    ' bei Fehler Text ausgeben
    Select Case ShExInfo.hInstApp
    Case SE_ERR_ACCESSDENIED
      Err.Raise 5, "ShellExecuteEx", "Zugriff verweigert"
    Case SE_ERR_FNF
      Err.Raise 5, "ShellExecuteEx", "Datei nicht gefunden"
    Case SE_ERR_NOASSOC
      Err.Raise 5, "ShellExecuteEx", "Datei ist mit keinem Programm verknüpft"
    End Select
  Else
 
    ' andernfalls Programmdaten ausgeben
    'MsgBox "Datei gestartet: " & ShExInfo.lpFile
    'Debug.Print "Dateiklasse: " & ShExInfo.lpClass
    MsgBox "Prozess Handle: " & ShExInfo.hProcess
    MsgBox "Instanz Handle:" & ShExInfo.hInstApp
    'Call GetWindowThreadProcessId(ShExInfo.hProcess, prid)
    MsgBox prid
  End If
Soooo, wie man in den letzten Zeilen Code erkennen kann, will ich aus dem Handle noch eine ID ermitteln. Aber soweit bin ich noch nicht, denn:
ShExInfo.hInstApp ergibt immer 42, also sone Dummy-Variante und
ShExInfo.hProcess ergibt immer 0...

Weiß vielleicht jemand, warum das so ist? Die Exe wird ordentlich gestartet. Hab ja auch nicht wirklich viel verändert.

Hm...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewerte von ShellExecuteEx 
Autor: stev-e87
Datum: 06.02.10 12:02

Ja wie das immer so ist, wenn man erst mal das Forum besucht hat, fällts einem doch noch wie Schuppen von den Augen...
mit
.fMask = SEE_MASK_NOCLOSEPROCESS
geht es, die ganzen or's haben das Ergebnis ruiniert. Jetzt aber folgendes Problem: ich verwende den Code in Excel VBA und dort kann ich kein
me.hwnd
setzen und deshalb meine Ausweichoption
application.hwnd
. Das liefert mir aber das Handle vom Explorer und nicht des gestarteten Programmes... In der Hoffnung, dass es mir jetzt auch gleich auffällt, wende ich mich noch einmal an euch...;)

gibt es ein Äquivalent für Excel- Tabellen? MfG
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewerte von ShellExecuteEx 
Autor: ModeratorMartoeng (Moderator)
Datum: 06.02.10 14:04

wie wäre es einfach mit 0?


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewerte von ShellExecuteEx 
Autor: stev-e87
Datum: 06.02.10 14:20

Auch das Handle vom Explorer ;( ...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewerte von ShellExecuteEx 
Autor: ModeratorMartoeng (Moderator)
Datum: 06.02.10 14:42

Also hwnd hat ja nur folgenden Sinn:
"Optional. A window handle to any message boxes that the system might produce while executing this function. This value can be NULL."

D.h., wenn keine MessageBoxen vom System erstellt werden, dann brauchst Du den Wert nicht. Das kann keinen Einfluss auf das Prozess-Handle etc. haben.
Gib doch mal noch zusätzlich SEE_MASK_NOASYNC als Flag mit an.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewerte von ShellExecuteEx 
Autor: stev-e87
Datum: 06.02.10 20:32

Das verwirrt mich jetzt.
mit diesem Flag (Or- verknüpft) bekomme ich den Wert des bei mir laufenden Duden- Korrektors. Was ich noch anmerken muss: ich spreche die ganze Zeit vom Prozess- Handle. Das lasse ich mir aber gar nicht ausgeben, sondern die mittels
Call GetWindowThreadProcessId(ShExInfo.hProcess, prid)
ermittelte dazugehörige ProzessID, welche ich mit der im TaskManager angegebenen abgleiche.

lasse ich das hWnd in Shellexecutex weg, bekomme ich die ID vom Prozess Excel ?!, mit der Angabe hWnd die vom Prozess Explorer und mit dem zusätzlichen Flag jene vom Duden- Korrektor- wie gesagt. Mir schwirrt so langsam der Kopf... Warum nicht vom Resource Hacker, welchen ich mit shellexecuteex starte...

Hat das was mit Win7 zu tun???
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewerte von ShellExecuteEx 
Autor: stev-e87
Datum: 07.02.10 09:33

Kritisches Thema ;) Soll eine Hilfestellung für den Arbeitsplatz werden, dann wird Resource Hacker durch eine andere Anwendung ersetzt. ResHacker lädt eben deutlich schneller...
Ja und da ist der Gebrauch von eigenen EXE- Files nicht gestattet. So eine quelloffene VBA- Geschichte ist da eben angebrachter.

Ich selber habe kein Visual Studio, kannst du den Codeschnipsel eventuell mal in VB testen? Dann hätte ich mal einen richtigen Vergleich ;( Das wäre wirklich sehr hilfreich. Vielen Dank an der Stelle trotzdem für die Unterstützung.

MfG
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewerte von ShellExecuteEx 
Autor: ModeratorMartoeng (Moderator)
Datum: 07.02.10 10:25

Also das funktioniert soweit ohne Probleme. Was Dein Fehler ist: die Funktion GetWindowThreadProcessId gibt die Thread-ID eines Fensters zurück und optional die Prozess-ID, des Prozesses, der das Fenster erstellt hat.

Dass hInstance manchmal komische Dinge gibt: "Although hInstApp is declared as an HINSTANCE for compatibility with 16-bit Windows applications, it is not a true HINSTANCE. It can be cast only to an int and compared to either 32 or the following SE_ERR_XXX error codes."
Ist nicht verwunderlich.

Mit GetProcessID kannst Du Dir die Prozess-ID eines Prozess-Handles ausgeben lassen.
Das funktioniert allerdings erst ab XP SP1. Ansonsten kannst Du die Prozesse enumerieren lassen und entsprechend vergleichen und dadurch die Prozess-ID ermitteln.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewerte von ShellExecuteEx 
Autor: ModeratorMartoeng (Moderator)
Datum: 07.02.10 10:29

Hier noch die Deklaration von getprocessid:
Private Declare Function GetProcessId Lib "kernel32.dll" (ByVal pHandle As Long) As Long


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewerte von ShellExecuteEx 
Autor: stev-e87
Datum: 07.02.10 12:38

Jahhhh!!!

Das klappt. Mensch, als Hinundwiedermaletwascoder ist man ohne Leute wie dich ja echt angepiept.

Vielen Dank!!!

Hab auch echt im Leben nicht daran gedacht, dass es daran hängt. Dachte zu 100%, es liegt an Shellexecuteex, da mir in heimischer Entwicklungsumgebung die Funktion Shell das richtige Ergebnis lieferte. Leider konnte ich Shell als solches auf Arbeit nicht anwenden und hab mich auf diese Variante versteift...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel