Announcement

Collapse
No announcement yet.

Fehler bei Shell-Function

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fehler bei Shell-Function

    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ß
    KRebsbachbub

  • #2
    Kann dir nicht sagen was bei dir schief läuft aber gibt es einen Grund die Win32API zu benutzen? Warum nicht einfach Process.Start("Notepad") oder eine Überladung davon um weitere Einstellungen vorzunehmen?

    Die Process Klasse findest du im System.Diagnostics Namespace.

    Comment


    • #3
      Mit der Process-Klasse kenne ich mich überhaupt nicht aus.
      Da ich dies zum erstenmal ausprobiere.
      Es ist auch so, dass der Benutzer den Pfad des Programms eingibt, denn es kann ja auch Excel oder Word sein.

      Also ich bin für jede Hilfe offen
      Gruß
      Krebsbachbub

      Comment


      • #4
        Nur lesen, was du selbst in den Code geschrieben hast

        open"Öffnet die Datei mit dem lt. Registry verknüpften Programm.

        Dann ist

        lpFile = sExProgramm '"c:\windows\notepad.exe"
        .lpParameters = sPfad & sdateiname '--> Datei die geöffnet werden soll"c:\autoexec.bat"

        falsch

        http://www.marquardtnet.info/cecke/q...quicky_18.html

        Die Beispiele sind zwar in C, aber solletest du nachvollziehen können.


        PS:

        Wenn ich das Riesengebilde sehe........
        Christian

        Comment


        • #5
          Danke für den Tipp.
          Hat alles funktioniert
          Danke
          Krebsbachbub

          Comment

          Working...
          X