vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 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
API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: Lilith
Datum: 04.04.11 21:29

Hallo,

ich habe mit VB6 ein Programm entwickelt, aus dem heraus ein DOS-Programm [dieses liegt als 32- und 64-Bit Variante vor, der Benutzer kann waehlen, welche Variante gestartet werden soll, abhaengig von seinem Betriebssystem] ueber die API-Funktion "CreateProcess" gestarter wird. Das DOS-Programm befindet sich in einem Unterordner des VB6-Programms.
Das Starten des DOS-Programms ueber CreateProcess funktioniert unter Windows 2000, XP, Vista und Windows 7, 32-Bit, aber nicht unter Windows 7, 64-Bit, wie mir 2 Benutzer gemeldet haben, und zwar weder in der 32-Bit noch in der 64-Bit-Variante. Direkt aus dem entsprechenden Ordner laesst sich das DOS-Programm in beiden Varianten starten.

Ich bin ziemlich ratlos und verzweifle langsam, habe leider auch kein Windows 64-Bit zum Testen verfuegbar.

Hier die Programmzeilen:

startProg = App.Path & "\" & PopeyeDir & "\" & pyEXE
solveTask = App.Path & "\" & InputDir & "\" & InputFile
ShellWait startProg & " " & solveTask, cbShowDOSWindow.Value = 1
 
Public Function ShellWait(cmdline As String, Optional ByVal bShowApp As Boolean _
  = False) As Boolean
  'Diese Funktion führt einen Befehl (in CmdLine) aus.
  'Dabei wird das sich öffnende Fenster unsichtbar gemacht.
  'Diese Funktion wird erst beendet, wenn der Befehl
  'vollständig abgearbeitet ist.
 
  'Die Datentypen initialisieren
  uStart.cb = Len(uStart)
  'uStart.wShowWindow = Abs(bShowApp)
  If cbShowDOSWindow.Value = 1 Then
    winStatus& = SW_SHOW
  Else
    winStatus& = SW_HIDE
  End If
  uStart.wShowWindow = Abs(bShowApp)
  uStart.dwFlags = 1
 
  'Fenster erzeugen
 
  lRetVal = CreateProcess(0&, cmdline, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, _
    0&, uStart, uProc)
Hat jemand eine Idee, warum CreateProcess gerade unter einem Windows 64-Bit nicht funktioniert?

Gruesse,
Lilywhite Lilith
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: ModeratorMartoeng (Moderator)
Datum: 04.04.11 23:06

Fast immer liegt sowas an fehlenden Rechten oder auch an Privileges, die man nicht eingeholt hat.


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

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: Lilith
Datum: 06.04.11 12:44

Hallo Martoeng,

danke fuer Deine Antwort!
Ich bin ziemlich ratlos mit diesem Problem, weil ich selbst keine Testumgebung mit WINDOWS 7 64-Bit habe.
Bevor ich mir nur fuer diesen Zweck einen neuen Rechner kaufe, wuerde es mir schon helfen zu wissen, ob es generell weiterhin moeglich ist [unter windows 200, XP und Vista 32-Bit funktioniert der Aufruf ja ohne irgendwelche Probleme!], ein Kommandozeilenprogramm, das in einer expliciten 64-Bit-Variante vorliegt, ueber die API-Funktion CreateProcess gestartet werden kann.
Ich habe mein Problem zuvor im MSDN-Forum von Microsoft geschildert. Leider gar keine Reaktion von den Cracks dort, fuer die es ein Leichtes waere, einen weiterfuehrenden Hinweis zu geben. Sehr enttaeuschend...

Danke fuer Deine Unterstuetzung.

Viele Gruesse
Lilith
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: Lilith
Datum: 06.04.11 12:50

@Martoeng

Ich hatte faelschlicherweise von einem DOS-Programm gesprochen, was Unsinn war. Es handelt sich um ein Kommandozeilen-Programm. Dieses befindet sich in einem Unterordner desjenigen Ordners, in dem sich das aufrufende VB6-Programm befindet. Ich denke, dass es in dieser Konstellation eher nicht mit fehlenden Rechten etwas zu tun hat [?].

Viele Gruesse
Lilith
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: ModeratorMartoeng (Moderator)
Datum: 06.04.11 14:01

Hmm, ne, dann sollte das vermutlich nicht mit Rechten zu tun haben.

http://www.eggheadcafe.com/software/aspnet/36029863/createprocess-in-64bit-windows-oder-windows-7.aspx

Hier gibt es schon mal ein paar Ansätze, die man mal durchprobieren könnte.

In welchem Pfad liegt dann das Programm? Da muss man beim Nachforschen auch aufpassen, weil Windows 7 die Ordner nach außen hin anders nennt, als diese intern wirklich heißen.


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

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: Lilith
Datum: 06.04.11 15:00

Hallo Martong,

herzlichen Dank fuer Deine Antwort!

auf diesen Link bin ich, neben vielen anderen, auch schon gestossen.
Hm, dem Hinweis auf moegliche Einfluesse eines Virenscanners auf den Programmstart werde ich mal nachgehen. Wenn sich der Virenscanner einklinkt und den Programmstart verzoegert, koennte es sein, dass die Funktion nicht lange genug wartet und zu frueh meldet, dass es nicht gestartet werden konnte??
Das koennte man dann wohl [hoffentlich] ueber die Auswertung von Err.LastDllError in Erfahrung bringen. Ansonsten konnte ich den Beitraegen auf der erwaehnten Seite nichts Weiterfuehrendes entnehmen.

Wo das VB6-Programm installiert wurde, werde ich mal erfragen. Ich bin in der ziemlich bescheuerten Situation, dass ich selbst keine Testumgebung habe und nur von 2 Benutzern die Rueckmeldung bekommen habe, dass das Kommandozeilenprogramm nicht startet. Beide haben Windows 7 64-Bit.
Vom Setup vorgegeben wird tatsaechlich der "Programme"-Ordner. Ich gehe mal davon aus, dass sich der Installationsordner dort befindet.

Mit dem naechsten Update werde ich dann wenigstens ueber Err.LastDllError den Fehler hoffentlich etwas genauer auswerten koennen.
Wenn ich aber halt wuesste, dass unter Windows 7 64-Bit die Funktion CreateProcess ueberhaupt nicht mehr funktioniert, koennte ich mir das Weiterforschen nach moeglichen Ursachen des Problems ganz sparen. Danach sieht es aber, nach allem, was ich in den Beitraegen zu dem Thema im Netz gefunden habe, wohl eher nicht aus.

Danke fuer Deine Unterstuetzung!

Viele Gruesse
Lilith
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: ModeratorMartoeng (Moderator)
Datum: 06.04.11 15:23

Bei Win7 64 gibt's einen Ordner für 32-bit-Programme und einen für 64-bit-Programme.

Wie sieht denn Dein Code mit CreateProcess zum Öffnen des Konsolenprogramms exakt aus? Poste da mal den kompletten Ausschnitt.

Generell funktionieren muss CreateProcess.
Andere Frage: muss es denn unbedingt mit CreateProcess sein? Es gibt ja auch über ShellExecuteEx die Möglichkeit was zu starten und dann auch auf die Beendigung zu warten. Wenn Du selbst keine Testumgebung hast, dann nwäre das vllt. eine gute Option, statt lange rumzufrickeln und nur durch Dritte Rückmeldungen zu erhalten.


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

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: Lilith
Datum: 06.04.11 15:46

Hier ein Beispiel des Programmaufrufs mit Übergabeparameter:

cmdline="c:\programme\chessdiagrammer\engines\popeye\pywin64.exe c:\programme\chessdiagrammer\engines\popeye\input\#4_04062011_154123.INP"

lRetVal = CreateProcess(0&, cmdline, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, uStart, uProc)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: ModeratorMartoeng (Moderator)
Datum: 06.04.11 18:22

Also bei Win7 gibt es ja keinen Programme-Ordner mehr in dem Sinne. Stell das mal um auf App.Path und dann entsprechendes Zeug dahinter.

Auch empfiehlt es sich Programm und Parameter zu trennen, sodass Du den ersten CreateProcess-Parameter auf das auszuführende Programm setzt und der zweite Parameter dann die Input-Datei enthält.

Sollte das nicht den gewünschten Erfolg haben, mal ShellExecute(Ex) ausprobieren. Ich weißt nicht, ob es für Dich wichtig ist, auf die Beendigung des Programms zu warten. Je nachdem brauchst Du die Ex-Variante oder es reicht die normale.


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

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: Lilith
Datum: 06.04.11 20:20

Danke fuer Deine Antwort!

Den Pfad uebergebe ich mit App.Path, ich wollte nur den kompletten Uebergabe-String mal zeigen, weil mir auch zwischendurch der Gedanke kekommen war, die Laenge koennte vielleicht Probleme machen.

Deinen Vorschlag, Programmaufruf und Parameter in zwei Strings zu uebergeben, werde ich gerne aufgreifen. Gerade schreibe ich ein kleines Tool, das nichts anderes tut als diesen Aufruf in verschiedenen Varianten durchzutesten, mit ordentlicher Fehlerauswertung. Ich hoffe, das fuehrt dann endlich auf die Spur dieses bis jetzt noch seltsamen Verhaltens.

Ich MUSS die Beendigung des aufgerufenen Programmes abwarten, weil eine Datei erzeugt wird, die dann in das VB-Programm geladen und angezeigt wird. Es handelt sich uebrigens um ein Schachloeseprogramm, das Schachprobleme loesen kann. Dia Aufgabe wird in einer Textdatei an das Kommandozeilenprogramm uebergeben und nach gefundener Loesung diese vom Programm in eine Textdatei geschrieben. Die lade ich dann wiederum in das VB-Programm zur Anzeige und Auswertung. Es kann aber auch sein, dass keine Loesung gefunden wird oder man die Such abbrechen moechte, weil sie zu lange dauert. Daher brauche ich die Kontrolle ueber den Prozess.

ShellExecute(EX) werde ich mir mal anschauen.

Herzlichen Dank fuer Deine Unterstuetzung!

Viele Gruesse
Lilith
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: Lilith
Datum: 06.04.11 23:10

Nun habe ich das Problem, dass ich bei Verwendung des Parameters:

ByVal lpAppName As Long

das Programm nicht einfach als String uebergeben kann [dies provoziert den Laufzeitfehler 13, "Typen unertraeglich"].
Wie muss ich denn den Programmnamen uebergeben??
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: ModeratorMartoeng (Moderator)
Datum: 06.04.11 23:29

Probier einfach mal mit "ByVal lpAppName As String" als Deklaration, das sollte so gehen.


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

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: Franki
Datum: 07.04.11 05:29

Hallo Lilith,

mal ganz dumm gefragt, von wem ist denn das Programm was da über Kommandozeile aufgerufen werden soll/muss. Wenn du das selbst geschrieben hast, dann kannst du doch da auch locker drauf verzichten. Oder den Code in eine DLL, eine Sub, Function, Webservice oder sonst was packen.

Gruß,
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: API-Funktion "CreateProcess": Problem mit Windows 7 64-Bit 
Autor: Lilith
Datum: 07.04.11 12:47

Hallo Franki,

es ist ein ganz spezielles Freeware-Programm, "Popeye", das Schachprobleme loesen kann.
Es liegt nur in dieser Kommandozeilenform vor, und ich habe dafuer ein GUI entwickelt, das die gesamte Kommunikation mit diesem Programm abwickelt und die zahlreichen Parameter, die man einstellen kann, in Dialogen anzeigt.

Gruesse,
Lilith
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