warum ::CreateProcess(Pfad,cmd,...) der Fehler "Datei nicht gefunden"?
Ich versuche, ein C++ - Programm aufrufen, eine schon aus C# - Programm im hintergrund laufen.
STARTUPINFO info = {sizeof(info)};
PROCESS_INFORMATION processinfo;
DWORD error1 = GetLastError();
bool x = ::CreateProcess((LPCWSTR)"C:\Convert_Shrink.exe", GetCommandLine(), NULL, NULL, false, 0,NULL,NULL, &info, &processinfo);
DWORD error = GetLastError();
error1 ist 0, bevor CreateProcess
Fehler 2 nach CreateProcess
Fehler 2:
ERROR_FILE_NOT_FOUND 2 (0x2) The system cannot find the file specified.
Ich habe es geändert zu C:\ \ incase Sie waren die Prüfung für die escape-Sequenzen aber ich bekomme immer noch 2 Fehler und ich bin nicht sicher, warum.
Dass cast nur Stoppt der compiler zu sagen, man, du hast es falsch. Es nicht zu stoppen Sie tun es falsch. Setzen Sie ein L vor den string, um es ein Unicode-literal.
ist es möglich, dass der Pfad der Anwendung nur so lange gut? Ich lege das Programm in C:\ zum testen, aber es muss im gleichen Verzeichnis wie das Programm, die tiefer in das Verzeichnis.
ist es möglich, dass der Pfad der Anwendung nur so lange gut? Ich lege das Programm in C:\ zum testen, aber es muss im gleichen Verzeichnis wie das Programm, die tiefer in das Verzeichnis.
InformationsquelleAutor Grant | 2011-06-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie:
Verwenden
CreateProcessA
entsprechend Ihrer ANSI-Datei-Pfad:* Geben Sie einen Dateipfad ein, die dem string entspricht, der-format benötigt durch Ihre Unicode-Einstellungen:
oder
Verwenden
CreateProcessW
so können Sie ein Unicode-filepath (unterstützt erweiterte Zeichen):(wie @dolphy festgestellt, das argument muss einen beschreibbaren string)
Geben Sie einen Dateipfad ein, die dem string entspricht, der-format benötigt durch Ihre Unicode-Einstellungen:
oder
Verwenden
CreateProcessW
so können Sie ein Unicode-filepath (unterstützt erweiterte Zeichen):(LPCWSTR)
mitL
und es ist alles gut! 😉NÖ,
CreateProcessW
erfordert das argument beschreibbar sein. MSDN verbietet ausdrücklich die übergabe eines string-literal.Sehr gut. Ich denke, das ist, weil die Implementierung verwendet die input-buffer für seine Analyse.
InformationsquelleAutor Ben Voigt
Nur für das Protokoll. CreateProcessAsUser Anrufe SearchPath-intern. Suchpfad verwendet die Datei System-Redirector https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187%28v=vs.85%29.aspx
So, wenn Sie eine 32-bit app unter WOW64 und Sie bitten, für einen Prozess mit einer exe-Datei im system32 dir z.B. "c:\windows\system32\myapp.exe", CreateProcessAsUser Aussehen wird, in syswow64 statt z.B."c:\windows\syswow64\myapp.exe". Wenn deine exe nicht da ist bekommst du eine "Datei nicht gefunden Fehler".
InformationsquelleAutor Felix
Ich habe gerade nachgeschaut GetCommandLine (), - und MSDN-Staaten, es wird die Kommandozeile für den aktuellen Prozess. MSDN-Eintrag für CreateProcess() besagt, dass das zweite argument ist der Kommandozeilen-Befehl, der ausgeführt werden soll, wenn ich lese es richtig. So sind Sie im wesentlichen sagen, CreateProcess (), um eine weitere Instanz der C++ - Programm, nicht das C# - Programm.
(Bearbeiten)
Tatsächlich, bei genauerem hinsehen, die CreateProcess () - Dokumentation nicht scheinen, um klar zu erklären, was passieren wird, wenn Sie die Versorgung der ersten und zweiten Argumente. Er sagt, dass die erste gibt die Modul-und die zweite gibt den Befehl Linie. Was ist der Unterschied?
Sorry für das nicht schlüssig beantworten, würde ich konvertieren, dass diese Antwort in ein paar der Kommentare auf Ihre Frage, wenn ich könnte.
InformationsquelleAutor Loduwijk
Haben Sie versucht, Gießen Sie die Zeichenfolge
LPCTSTR
statt:Von Microsoft:
Fair genug. Ich denke, es war nicht offensichtlich für mich, dass es eine unicode-Version, andere als die Darsteller selbst, die ich fragte. Aber dann, dass das wohl bedeutet, ich sollte nicht Antworten.
Es ist schlechte Idee zu werfen, um
(LPCTSTR)
. Weil Literale wird dasselbe sein. Richtige Weg ist, _T() Makros.Die docs, die Sie zitiert sind auch unglaublich wichtig, und erwischt einen Fehler, den ich zunächst. Aber nochmal, eine Besetzung ist nicht die Lösung.
Vereinbart. Der einzige Grund, warum ich noch nicht gelöscht, ist die Antwort, so dass andere lernen können, die genaue Unterscheidung (wie ich es eben Tat).
InformationsquelleAutor dolphy