ShellExecuteEx unter Windows CE


mrkorn

Grünschnabel
Hallo zusammen

Versuche im Moment mit Visual Studio 2005 und VB eine Geräteanwendung für Windows CE zu programmieren.

Das Programm soll andere Programme öffnen können, also hab ich herum gesucht und bin dann öfters über die APIs gestoßen.

Nun versuche ich mit VB auf die API-Funktion ShellExecuteEx zu zugreifen, diese Funktion befindet sich auf Windows Ce in der coredll.dll, das weiß ich da man mit dem Programm "Dependency Walker" DLL Dateien öffnen kann und sich die vorhandenen Funktionen anzeigen lassen kann.

Es gibt zwar einige Beispiele im Internet, jedoch bekomme ich auf meinem CE-Gerät immer ein Fehler angezeigt:

Can't find an Entry Point 'ShellExecuteExW' in a PInvoke DLL 'coredll'

ShellExecuteEx ist mit W erweitert da WinCE auf Unicodebasis arbeitet, hab aber auch A als ANSI_Erweiterung angehängt, und auch ohne Erweiterung bekomme ich immer den selben Fehler... (Erklärung der Erweiterung unter: http://msdn2.microsoft.com/en-us/library/ms912056.aspx)

Mein ProgrammCode:



Public Class Form1
Dim hWnd = HWND

Private Declare Function ShellExecute Lib "coredll" Alias "ShellExecuteExW" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Const SW_SHOWNORMAL = 1
Private Sub Form_Load()

ShellExecute(hWnd, vbNullString, "explorer.exe", vbNullString, "c:\", SW_SHOWNORMAL)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Form_Load()

End Sub
End Class



Ich hoffe hier kann mir jemand helfen...

Danke im vorraus

Thomas
 

mrkorn

Grünschnabel
So hab mal noch was gefunden, das mich einen Schritt weiterbringt. und zwar hab ich eine etwas andere Art von Deklaration gefunden (http://www.activevb.de/rubriken/faq/netfaq0153.html):

Deklaration:
<Runtime.InteropServices.DllImport("coredll.dll", EntryPoint:="ShellExecuteEx", CharSet:=Runtime.InteropServices.CharSet.Unicode)> _
Public Shared Function ShellExecuteEx( _
ByVal hwnd As IntPtr, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Integer
End Function

Funktionsaufruf:
ShellExecuteEx(hWnd, "open", "explorer.exe", vbNullString, "", SW_SHOWNORMAL)

Dies führt nun dazu, daß mein Programm unter WinCE nun keine Fehlermeldung mehr produziert, aber ein Programm wird nicht gestartet...
 

MCoder

Erfahrenes Mitglied
Warum arbeitest du denn nicht mit der .NET-Klasse "System.Diagnostics.Process", statt dich mit der Einbindung der API-Funktion zu quälen.

Gruß
MCoder
 

mrkorn

Grünschnabel
Danke für deinen Tip, bin vorher nicht über diese Klasse gestolpert...

Hier ist mein Programm Code der problemlos unter Windows Ce läuft:
---------------------------------------------------------------------------------------
Imports System.Diagnostics
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim p As New System.Diagnostics.Process()
Process.Start("explorer.exe", "\windows")
End Sub
End Class
---------------------------------------------------------------------------------------

Es kann alles soooo einfach sein, und ich versuchs mich mit der API in VB...:)
Gruß
Thomas
 

mrkorn

Grünschnabel
Hallo

Es hat sich jetzt doch noch ein kleines Problem ergeben. Und zwar kann ich bei Process.Start kein Pfad angeben der ein Leerzeichen enthält.

Process.Start("\Windows\cmd.exe /c '\USB HD\Update\upddlt.bat'", "")
oder so
'Process.Start("\Windows\cmd.exe /c","\USB HD\Update\upddlt.bat")

hab es dann noch mit Escape-Sequenzen versucht:
Dim returnValue As String
returnValue = Regex.Escape("\Windows\cmd.exe /c \USB HD\UpdateDone\upddlt.bat")
Process.Start(returnValue, "")
oder so manuell
Process.Start("\\Windows\\cmd\.exe\ /c\ \\USB\ HD\\UpdateDone\\upddlt\.bat", "")

Wenn ich im WindowsCE Start->Ausführen mache und dies eingebe:
\Windows\cmd.exe /c "\USB HD\Update\upddlt.bat"
funktioniert es ohne Probleme...

Jemand eine Idee?
Gruß
Thomas
 

mrkorn

Grünschnabel
Danke.
Hab da mal ein bischen herum probiert, aber es ist immer noch das selbe, sobald ein Leerzeichen in der Pfadangabe vorkommt findet er die Datei nicht mehr...
Code:
Dim ProcStartInfo As New ProcessStartInfo()
        With ProcStartInfo
            .FileName = "\windows\cmd.exe"
            .UseShellExecute = True
            .Arguments = " /c \Nor Flash\APP\1\hello.bat"
oder so
Code:
            .FileName = "\Nor Flash\APP\1\hello.bat"
            .UseShellExecute = True
        End With
        System.Diagnostics.Process.Start(ProcStartInfo)
Es muß an der Leerstelle in der Pfadangabe liegen, da dies funktioniert:
Code:
            .FileName = "\windows\cmd.exe"
            .Arguments = " /c \windows\hello.bat"
oder so
Code:
            .FileName = "\windows\hello.bat"
            .UseShellExecute = True
Die Datei soll sich aber nicht im Windows Verzeichnis befinden, sondern in dem mit der Leerstelle...
 

Nico Graichen

Erfahrenes Mitglied
Hi

Unter C# gibt es die Möglichkeit einen String zu maskieren (mit @). Schau mal, ob so etwas auch in VB.NET gibt.

Alternativ: Pack den String in ein resx-File und hol ihn daher. Ist sowieso besser, anstatt Strings in den Quellcode zu schreiben!
 

mrkorn

Grünschnabel
Den String in eine resx.Datei zu stecken bringt keinen Unterschied.
Zum Thema maskieren wie in C# mit @, hab ich nichts gefunden...
Das einzigste ist Regex.Escape und das macht auch keinen Unterschied, hab ich ja schon in einem vorherigen Post versucht gehabt...