CreateProcess()



  • Hallo!

    Zur Zeit arbeite ich an der Uni und wurde ins kalte Wasser geschmissen:
    Durfte gleich mal einen alten Win32 Api Code aus dem Jahre '96 durchkauen, obwohl ich nie wirklich programmiert habe.
    Ich sollte ihn neu überarbeiten, damit man die Software wieder verwenden kann.

    Habe schon die eine oder andere Funktion neu eingebracht, weil das alte nicht mehr funktionierte.

    Nun eben muss ich auch WinExec neu ersetzen, weil 16-Bit Windows etwas zu klein ist. In msdn wird CreateProcess vorgeschlagen.

    Nun habe ich WinExec durch CreateProcess ersetzt (mit Hilfe auch meiner Chefin) und jetzt taucht folgendes Problem auf:

    Wir haben es getestet mit einem Notepad.exe und anderen .exe und CreateProcess hat wunderbar diese Dateien geöffnet. Der Code scheint also zu funktionieren.

    Jetzt kommt der Clou: Die Software - deren Quellcode ich überarbeite - gehört zu einem Gerät, wo eine .exe existiert, die geöffnet werden muss, damit man sein eigen geschriebenes Programm parallel laufen lassen und verwenden kann.
    Aber genau diese wichtige .exe kann CreateProcess nicht öffnen.

    Also meine Frage: Wie kann es sein, dass ich bei gleichem Code, richtigem Pfad alle .exe öffnen kann, nur nicht die, die zu dem Gerät gehört, dessen Quellcode wir von der Firma zur Verfügung gestellt bekommen haben?!? 😕

    Danke schon mal an alle, die mit Ideen ankommen..



  • WinExec wird zwar laut MS nur aus Kompatibilitätsgründen zu 16-Bit-Windows mitgeführt, das heißt aber nicht, dass man es nicht benutzen darf. Du kannst damit auch 32-Bit-Software starten. Es wird lediglich empfohlen, doch bitte CreateProcess zu nutzen. Deine Software läuft aber sicher auch gut mit WinExec.

    Also hat es mit WinExec funktioniert? Was sagt GetLastError nach dem fehlgeschlagenen CreateProcess-Aufruf?



  • Ach ja, noch was:

    wenn ich CreateProcess in einem komplett anderen Projekt verwende, das nichts mit der Software des Gerätes zu tun hat, einfach nur ein neuer Code, um CreateProcess zu testen.

    Dann kann ich die .exe zu dem Gerät mit CreateProcess öffnen.
    Nicht aber in dem Projekt, das zu dem Gerät gehört..

    Es soll ja nicht zu einfach werden 😉



  • mit WinExec funktioniert es ebenso wenig

    hab alles versucht.. geht nicht



  • Und wenn es nicht geht, dann muss man GetLastError aufrufen (direkt nach dem fehlgeschlagenen CreateProcess), um Genaueres zur Ursache zu erfahren.

    Vielleicht findet er die exe nicht. Gibst du beim ersten Parameter einen absoluten Pfad mit? Wenn nicht, versuch das mal.



  • also hab mal GetLastError dahinter gepackt.
    der gibt mir 2 aus. wenn ich richtig gesucht hab, heißt das er findet es nicht?

    das versteh ich aber nicht.
    ich versuche das in zwei verschiedenen Projekten.
    das eine zur software zugehörig. hier schafft CreateProcess es nicht die .exe zu öffnen.
    das andere ist ein völlig unabhängiges Programm, das mit der Software nix zu tun hat, da kann CreateProcess das ganze öffnen.

    es ist der exakt gleiche Code und der exakt gleiche Pfad.
    bei dem einen gehts, bei dem anderen nicht.

    Kann es sein, dass es damit zusammenhängt, dass die original software und Quellcode aus '96 ist und irgendwo ein Hund begraben liegt, der verhindert, dass CreateProcess seinen Job macht??

    obwohl CreateProcess andere .exe öffnen kann. nur eben die eine nicht...

    ich blicks nicht mehr...



  • Hi, willkommen im Win-API Forum!

    Auch wir haben unsere holprigen Anfänge erlebt 😮

    Zu Deinem Problem:
    Wir müssen davon ausgehen daß der "richtige Pfad" immer als absoluter Pfad gemeint ist (also einschließlich Laufwerksbuchstaben am Anfang!).
    Je nachdem wie Ihr die Pfade handhabt, Leerzeichen in Pfade ohne Anführungszeichen führen meistens zu Problemen.

    Grundsätzlich:
    Fast alle Win-API Funktionen liefern einen Rückgabewert zurück.
    Meistens enthält dieser einen Hinweis auf einen aufgetretenen Fehler.
    Wenn dies so eingetreten ist, liefert meistens GetlastError() den Fehlercode für die genaue Fehlerursache.
    Diesen Fehlercode kannst dann entweder per MessageBox ausgeben oder mit dem Debugger ansehen.

    Kennst Du schon die MSDN? Hier die Doku zu CreateProcess():
    http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx

    In Deinem Fall mit CreateProcess() gibt es vielfältige Ursachen.
    -Hat die Applikation die Ihr starten wolltet, vielleicht noch den uralten 16-Bit Code?
    -Hat CreateProcess() überhaupt erfolgreich die Applikation gestartet oder nicht? D.h. falls erfolgreich, dann ist der Fehler wohl in der Applikation zu suchen.
    -Benötigt die Applikation fürs Starten Administrator-Rechte?
    -usw.

    Des weiteren hast Du nicht geschrieben, ob Ihr 32- oder 64-Bit Windows Version im Einsatz hat.
    Denn durch WOW64 verhält sich CreateProcess() auf 64-Bit Systemen ein wenig anders als auf 32-bit Systemen.

    Martin



  • hi!

    also, meine cheffin war grad da und hat auch mitgelesen und wir sind zu der Einsicht gekommen, dass es wohl daran liegt, dass der Code veraltet ist.

    Wie schon erwähnt, hatte ich mit mehreren Funktionen schon Probleme und musste teilweise Sachen komplett neu programmieren, und deshalb denke ich, dass das Problem im 16-Bit Windows liegt. Weil darin ist der code geschrieben und das läuft einfach heutzutage nicht mehr. (was unser system ist, weiß ich leider nicht - bin ja froh schon überhaupt den Code teilweise verstanden zu haben 🙄 )

    Aber danke an alle, die versucht haben mir zu helfen.
    Hier werde ich öfter rein gucken. Jetz wo ich schon angefangen hab, mach ich auch weiter mit programmieren :p



  • player2605 schrieb:

    Wie schon erwähnt, hatte ich mit mehreren Funktionen schon Probleme und musste teilweise Sachen komplett neu programmieren, und deshalb denke ich, dass das Problem im 16-Bit Windows liegt. Weil darin ist der code geschrieben und das läuft einfach heutzutage nicht mehr. (was unser system ist, weiß ich leider nicht

    16-Bit-Anwendungen laufen durchaus unter 32-Bit-Windows, nur leider nicht mehr unter x64. Welches Betriebssystem du hast, kannst du unter Systemsteuerung=>System herausfinden. Da dürfte dann was von x64 oder 64 Bit stehen.

    Probier es mit absolutem Pfad!


Anmelden zum Antworten