Problem mit ShellExceuteEX

enrico_tietz

Grünschnabel
Ich implementiere die Funktion folgendermaßen:
Code:
[DllImport("shell32.dll")]
private static extern int ShellExecuteEx([MarshalAs(UnmanagedType.Struct)]  ShellExecuteInfo ShExecInfo);

Mir ist unklar was ich mit der Structur machen soll, wie kann ich diese unter C# nachbilden?

Danke!
 
Hallo,
also ich habe es jetzt folgendermaßen versucht.

Code:
[DllImport("shell32.dll")]
private static extern int ShellExecuteEx(SHELLEXECUTEINFO ShExecInfo);

[StructLayout(LayoutKind.Sequential)]
private class SHELLEXECUTEINFO
{
     public int cbSize;
     public int fMask;
     public int hwnd;
     [MarshalAs(UnmanagedType.LPWStr)]
     public string lpVerb;
     [MarshalAs(UnmanagedType.LPWStr)]
     public string lpFile;
     [MarshalAs(UnmanagedType.LPWStr)]
     public string lpParameters;
     [MarshalAs(UnmanagedType.LPWStr)]
     public string lpDirectory;
     public int nShow;
     public int hInstApp;
     public int lpIDList;
     public string lpClass;
     public int hkeyClass;
     public int dwHotKey;
     public int hIcon;
     public int hProcess;
};

//  Aufruf
public void Test()
{
     SHELLEXECUTEINFO ShExecInfo = new SHELLEXECUTEINFO();
     
     ShExecInfo.cbSize = Marshal.SizeOf(ShExecInfo);
     ShExecInfo.fMask  = 0;
     ShExecInfo.hwnd   = 0;
     ShExecInfo.lpVerb = "open";
     ShExecInfo.lpFile = "notepad.exe";
     ShExecInfo.lpParameters = "";
     ShExecInfo.lpDirectory  = null;
     ShExecInfo.nShow = 0;
     ShExecInfo.hInstApp = 0;

     //ShellExecute(0, "open", "notepad.exe", "", null, 8);
     
     ShellExecuteEx(ShExecInfo);

     WaitForSingleObject(ShExecInfo.hProcess, 0xFFFFFFFF);
}

Ich erhalter folgende Fehlermeldung:

"n" konnte nicht gefunden werden. Stellen sie sicher das sie den Namen korrekt eingegeben haben.

Kann mir bitte jemand sagen was hier falsch läuft?

Danke
 
enrico_tietz hat gesagt.:
Ich erhalte folgende Fehlermeldung:

"n" konnte nicht gefunden werden. Stellen sie sicher das sie den Namen korrekt eingegeben haben.

Kann mir bitte jemand sagen was hier falsch läuft?

Danke
Hallo enrico_tietz!

Kein Ahnung. Ich seh da nichts von "n".
Via Exeptions ( im Forum :google: ) solltest die Zeile des Fehlers herrausfinden können.

Was willst eigentlich machen?
Der Ablauf sieht für mich nach Prozess starten und warten bis er wieder beendet wurde aus.
Vielleicht reicht je die System.Diagnostics.Process-Klasse ( im Forum :google: ) für dein Vorhaben völlig aus. ;-]

MfG, cosmo
 
Zuletzt bearbeitet:
Also ich hab das snippet 1:1 kopiert und das lässt sich prima kompilieren. Ich tippe mal drauf, dass der Fehler woanders ist.

Gruss Alexander
 
Also nochmal zu diesem Thema
ich habe das Marschaling weggelassen und schon geht es.
Das "n" ist das erste Element in lpFile-String.
Anscheinend nimmt er nur das erste Zeichen. Kann es sein das das Marschaling falsch ist?
 
Hallo enrico_tietz!

Gegenfrage. Warum versuchst es nicht mal mit der System.Diagnostics.Process Klasse?
http://www.pinvoke.net/default.aspx/shell32.ShellExecuteEx hat gesagt.:
Alternative Managed API:

The Process class uses ShellExecuteEx by default:

Dim p As New Process
p.StartInfo.FileName = "somefile.html"
p.Start()
Gibt es einen Grund das Du das jetzt unbedingt händisch versuchen willst?
Ich muss hinzufügen das ich mit ShellExecuteEx noch nichts gemacht hab.
Daher kann ich Dir dazu keine weiteren Infos geben. :(

MfG, cosmo
 
Ich habe das Problem bereits mit System.Diacnostics gelöst.
Es läst mir aber keine Ruhe, wieso der ShellExecutebefehl nich ausführbar ist.
 
Zurück