Warnmeldung und CreateProcess Vs. ShellExecute
-
Hi,
ich habe zwei Fragen.1.Was kann ich tun wenn ich beim ausführen meiner Anwendung folgende Warnmeldung bekomme (Der Prozedureinsprungspunkt „GetProcessIdOfThread“ wurde in der DLL „KERNEL32.dll“) nicht gefunden.“ ?
2.Mit der ShellExecute Funktion ist es kein Problem ein Programm mit Parameterübergabe zu starten. Nur ich erhalte dann nicht genug Informationen um die WaitForSingleObject Funktion aufzurufen.
Mit der CreateProcess Funktion erhalte ich zwar alle Informationen die ich brauche um dann die WaitForSingleObject Funktion aufzurufen, aber ich kann mit CreateProcess keine Parameter übergeben. Ist es bei CreateProcess irgendwie möglich Parameter an das Programm mit zu übergeben (z.B. den Pfad einer Datei die das aufgerufene Programm automatisch öffnen soll)?
Und gibt es eine allgemeine Lösung? (Programmaufruf mit Parameter Übergabe und Übehrwachung wann und wie das Programm geschlossen wird „Error or not“)
BS: Windows XP
VC++.net Standard 2003 (MFC)Für die Antworten bedanke ich mich im Voraus
Dol
-
1. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getprocessidofthread.asp --->
Requirements:
Server: Requires Windows Server 2003.
2. Einer der Parameter von CreateProcess nennt sich LPTSTR lpCommandLine. Was sollte dich daran hindern dort parameter zu übergeben (C:\test.exe -param1 -param2)?

-
Danke CMatt!!
CreateProcess funktioniert jetzt einwandfrei!!Ich habe die Parameter falsch eingegeben
Ich Falsch: : (
::CreateProcess("G:\\OrdnerTest\\CopyTest.bat", "Test Bla", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);Dank CMatt Richtig : )
::CreateProcess(NULL, "G:\\OrdnerTest\\CopyTest.bat Test Bla", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);Ich hätte trotzdem noch eine Frage. Ist es möglich mit dieser Funktion auch Errors vom aufgerufenen Programm zu empfangen und auswerten?
Gruß Dol
-
Kommt drauf an was du unter errors verstehst

Wenn dein 2. Programm bei nem Fehler die Artbeit einstellen soll und dein 1. das mitbeommen soll, gibt in der CWinAPP::ExitInstance nen fehlercode zurück. Im 1. Prog kommts dann ganz leicht GetExitCodeProcess an den Wert ran

-
Ich habe die Geschichte GetExitCodeProcess ausprobiert aber ich glaube, dass ich bei der Ganzen Geschichte noch einfach zuwenig Erfahrung habe.
Hier ist Mein Code:
Beim Kompilieren kommt folgende Fehlermeldung:'GetExitCodeProcess': Konvertierung des Parameters 2 von 'LPDWORD *__w64 ' in 'LPDWORD' nicht möglich
::PROCESS_INFORMATION pi ; ::STARTUPINFO si = {sizeof(si)}; si.wShowWindow = SW_NORMAL; ::CreateProcess(NULL, "G:\\Auftrag\\Projekt_JobHandler\\OrdnerTest\\CopyTest.bat Tes Bla", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); ::WaitForSingleObject( pi.hProcess, INFINITE); ::LPDWORD ExitCode1; ::UINT ExitCode2; ::ExitProcess(ExitCode2); ::GetExitCodeProcess( pi.hProcess,&ExitCode1); ::CloseHandle(pi.hProcess); ::CloseHandle(pi.hThread); ::MessageBox( NULL,"done", NULL, 0);Und dann habe ich noch ein kleines Problem mit der CreateProcess Funktion. Wenn in der Pfadangabe ein Leerzeichen vorkommt, weißt die Funktion nicht wo die Parameter anfangen. Was kann ich da tun?
Das ist OK:
::CreateProcess(NULL, "G:\\OrdnerTest\\CopyTest.bat Tes Bla", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);Das geht nicht:
::CreateProcess(NULL, "G:\\Ordner Test\\CopyTest.bat Tes Bla", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);Danke im Voraus für Hilfe

Dol
-
DWORD ExitCode1;
-
und zum zweiten Problem:
"\"G:\\Ordner Test\\CopyTest.bat\" Tes Bla"
hab ich aber nicht getestet

-
Danke Unregistrierter : )
Die Beiden Tipps Funktionieren Super!!!
Jetzt habe ich noch ein Kleines Problem das wieder etwas mit den „Windows Date Types" zutun hat.
Error:
Run-Time Check Failure #3 - The variable 'ExitCode2' is being used without being defined.
::UINT ExitCode2; ::ExitProcess(ExitCode2);oder
Fehlermeldung:
error C2664: 'ExitProcess': Konvertierung des Parameters 1 von 'UINT *__w64 ' in 'UINT' nicht möglich
::UINT ExitCode2; ::ExitProcess(&ExitCode2);Was ist da nicht in Ordnung?
Gruß Dol
-
weise der Variablen ExitCode2 einen Wert zu. Sonst ist das Verhalten undefiniert.
bsp: UINT ExitCode2 = 42;
-
Es scheint noch nicht ganz zu klappen

Error:
Unbehandelte Ausnahme bei 0x7c29ed41 (mfc71d.dll) in Prozess.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0xf78c4cf8.
::UINT ExitCode2 = 42; ::ExitProcess(ExitCode2);Noch ne Idee?
Habt Geduld mit mir

-
Der Fehler liegt wahrscheinlich woanders.

-
Machs am besten nach dem Motto "Was nicht funktioniert wird auskommentiert".
-

-
lach schrieb:
Machs am besten nach dem Motto "Was nicht funktioniert wird auskommentiert".

-
Also das ExitProcess würde ich mir in ner MFC anwendung besser 10 mal überlegen. Das gibt nächlich der MFC nicht mehr viele möglichkeiten all ihren mit aufzuräumen

Beende lieber dein Prog auf normalen weg (mit ner WM_CLOSE z.B.) und gib den errorcode über deine WinApp zurück, wie ich oben geschrieben hab.
