Fehler bei Shell-Function

czemmel

Mitglied
Hallo zusammen,
ich arbeite gerade an einer Klasse, die Daten in eine Datei speichern soll und wenn dann die Parameter mitgegeben werden, auch das externe Programm öffnen.
Mein Versuch beschränkt sich auf das Notepad.
leider bekomme ich immer die Fehlermeldung, dass eine Datei beschädigt ist.
Hier mein Code für die dekleration:
[dotnet]
#Region "Execute Shell"
Private Declare Function ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteExA" (ByRef lpExecInfo As SHELLEXECUTEINFO) As Long
Private Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Structure SHELLEXECUTEINFO
Dim cbSize As Long
Dim fMask As Long
Dim hwnd As Long
Dim lpVerb As String
Dim lpFile As String
Dim lpParameters As String
Dim lpDirectory As String
Dim nShow As Long
Dim hInstApp As Long
Dim lpIDList As Long
Dim lpClass As String
Dim hkeyClass As Long
Dim dwHotKey As Long
Dim hIcon As Long
Dim hProcess As Long
End Structure


' SHELLEXECUTEINFO fMask-Konstanten
Private Const SEE_MASK_CLASSKEY = &H3 ' Struktur wird mit dem Handle des Registry - Schlüssels für die Klasse gefüllt
Private Const SEE_MASK_CLASSNAME = &H1 ' Struktur wird mit dem Klassennamen oder GUID gefüllt der die Datei beschreibt
Private Const SEE_MASK_CONNECTNETDRV = &H80 ' Struktur verbindet den PC mit einem Netzlaufwerk falls nötig, lpFile muss der UNC-Pfadname in dem Netzwerk sein
Private Const SEE_MASK_DOENVSUBST = &H200 ' Struktur wird mit Umgebungsvariablen des Programms gefüllt, diese werden in lpDirectory oder lpFile gepackt
Private Const SEE_MASK_FLAG_DDEWAIT = &H100 ' die Funktion wartet, dass die DDE ihre Vorgänge abgeschlossen hat und kehrt dann erst zurück
Private Const SEE_MASK_FLAG_NO_UI = &H400 ' die Funktion zeigt keine Fehler-Dialogboxen an
Private Const SEE_MASK_HOTKEY = &H20 ' dwHotkey wird gefüllt
Private Const SEE_MASK_ICON = &H10 ' hIcon wird gefüllt mit dem Icon-Handle des Standard-Icons der Anwendung
Private Const SEE_MASK_IDLIST = &H4 ' benutzt die lpIDLIST-Option um das Programm zu starten, das in ihr beschrieben ist
Private Const SEE_MASK_INVOKEIDLIST As Long = &HC ' benutzt die lpIDLIST-Option um das Programm zu starten, das in ihr beschrieben ist
Private Const SEE_MASK_NOCLOSEPROCESS = &H40 ' füllt die Struktur-Option hProcess mit dem Process-Handle der gestarteten Anwendung

' SHELLEXECUTEINFO nShow-Konstanten
Private Const SW_HIDE = 0 ' versteckt das Fenster
Private Const SW_MAXIMIZE = 3 ' maximiert das Fenster
Private Const SW_MINIMIZE = 6 ' minimiert das Fenster
Private Const SW_RESTORE = 9 ' stellt das Fenster wieder her
Private Const SW_SHOW As Long = 5 ' zeigt das Fenster an
Private Const SW_SHOWMAXIMIZED = 3 ' zeigt das Fenster maximiert an
Private Const SW_SHOWMINIMIZED = 2 ' zeigt das Fenster minimiert an
Private Const SW_SHOWMINNOACTIVE = 7 ' zeigt das Fenster minimiert an, aber aktiviert es nicht
Private Const SW_SHOWNA = 8 ' zeigt das Fenster an, aber aktiviert es nicht
Private Const SW_SHOWNOACTIVATE = 4 ' zeigt das Fenster in der besten Größe und Position an, aber aktiviert es nicht
Private Const SW_SHOWNORMAL = 1 ' zeigt das Fenster ganz normal an

' SHELLEXECUTEINFO hInstApp Rückgabe-Konstanten
Private Const SE_ERR_ACCESSDENIED = 5 ' Zugriff verweigert
Private Const SE_ERR_ASSOCINCOMPLETE = 27 ' Dateityp ist nicht ausreichend assoziiert
Private Const SE_ERR_DDEBUSY = 30 ' DDE konnte nicht gestartet werden
Private Const SE_ERR_DDEFAIL = 29 ' DDE ist gescheitert
Private Const SE_ERR_DDETIMEOUT = 28 ' DDE-Zeitlimit wurde ereicht
Private Const SE_ERR_DLLNOTFOUND = 32 ' eine benötigte Dll wurde nicht gefunden
Private Const SE_ERR_FNF = 2 ' Datei wurde nicht gefunden
Private Const SE_ERR_NOASSOC = 31 ' Dateityp ist nicht assoziiert
Private Const SE_ERR_OOM = 8 ' nicht genügend Speicher verfügbar
Private Const SE_ERR_PNF = 3 ' Pfad wurde nicht gefunden
Private Const SE_ERR_SHARE = 26 ' Datei konnte nicht geöffnet werden, da sie bereits verwendet wird

' SHELLEXECUTEINFO dwHotKey-Konstanten
Private Const HOTKEYF_ALT = &H4 ' benutzt ALT für den Hotkey
Private Const HOTKEYF_CONTROL = &H2 ' benutzt STRG für den Hotkey
Private Const HOTKEYF_EXT = &H8 ' benutzt den Extendend-Key für den Hotkey
Private Const HOTKEYF_SHIFT = &H1 ' benutzt Shift für den Hotkey

' WaitForSingleObject dwMillisekond-Konstante
Private Const INFINITE = &HFFFF ' unendlich warten

' WaitForSingleObject Rückgabe-Konstanten
Private Const WAIT_ABANDONED = &H80 ' der Mutex, der in hHanlde angegeben ist wird
' nicht freigegeben, so lange der Eltern-Thread zerstört ist. Der Mutex ist nun
' Bestandteil des aufrufenden Threads und ist nicht mehr im signalisierenden Status
Private Const WAIT_FAILED = &HFFFFFFFF ' die Funktion ist gescheitert
Private Const WAIT_OBJECT_0 = &H0 ' das Objekt. das in hHandle spezifiziert ist,
' ist in einem signalisierendem Status
Private Const WAIT_TIMEOUT = &H102 ' das Zeitlimit für eine Änderung des
' Thread-Statuses ist abgelaufen

#End Region
[/dotnet]

Und hier der code beim Aufruf:
[dotnet]
' Startoptionen festlegen
Dim Retval As Long
Dim ShExInfo As SHELLEXECUTEINFO


With ShExInfo
.cbSize = Len(ShExInfo)
.fMask = SEE_MASK_FLAG_NO_UI Or SEE_MASK_CLASSNAME Or SEE_MASK_NOCLOSEPROCESS
'.hwnd = Me.hwnd
.lpVerb = "open"
'lpVerb(Kommandos)
'"edit"Verhält sich so, als würde man im Kontextmenü des Explorers auf "Bearbeiten" klicken.
'"explore"Handelt es sich bei "lpFile" um einen Verzeichnispfad, wird der Windows Explorer in Verbindung mit diesem Verzeichnis geöffnet.
'"find"Handelt es sich bei "lpFile" um einen Verzeichnispfad, wird der Windows Suchen-Dialog gestartet.
'"open"Öffnet die Datei mit dem lt. Registry verknüpften Programm.
'"print"Druckt das Dokument in Verbindung mit der verknüpften Anwendung.
'"properties"Zeigt die Verzeichnis- oder Datei-Eigenschaften
.lpFile = sExProgramm '"c:\windows\notepad.exe"
.lpParameters = sPfad & sdateiname '--> Datei die geöffnet werden soll"c:\autoexec.bat"
.lpDirectory = sPfad ' "c:\"
.nShow = SW_SHOWMAXIMIZED
End With

' Programm ausführen
Retval = ShellExecuteEx(ShExInfo)

[/dotnet]

Hat jemand eine Idee was ich falsch mache
bin für jede Hilfe Dankbar
Gruß
Czemmel
 
Hallo,

ohne jetzt deinen Code genau angeschaut zu haben: Warum arbeitest du nicht mit der Klasse System.Diagnostics.Process, statt dich mit der API zu quälen?

Gruß
MCoder
 
Wenn die einfacher ist, mach ich das gerne.
Aber ich habe mit der noch nie gearbeitet und hab keine Ahnung

Gruß
Czemmel
 
Danke für den Hinweis, ich brauche nur noch die richtige Einstellung um eine bestimmte Datei zu öffnen.
Gruß
Czemmel
 
Danke eigentlich für alles:
Mein Code lautet jetzt folgendermaßen:

Code:
Dim oProcess As Process
oProcess = System.Diagnostics.Process.Start(sExProgramm, sPfad & sdateiname)

Gibt es hier auch ein gescheites Error-Handling, wie z.b. kann nicht zugegriffen werden ,da schreibgeschützt usw. oder muss ich mir da was eigenes ausdenken.
Gruß
czemmel
 
Bei Fehlern werden Exceptions ausgelöst, die du via try/catch behandeln musst. Schaue dazu mal in die Klassenreferenz von Process.

Gruß
MCoder
 

Neue Beiträge

Zurück