Externer Process????
-
Würde gerne einen Externen Process aus meiner Win-Forms-Anwendung starten.
Habs auch schon mit ShellExecute() und system() versucht.
Gibt`s da noch eine Alternative dazu?std::string pfad = "C:\notepad.exe"; PROCESS_INFORMATION pi = {0}; STARTUPINFO si = {sizeof(si)}; si.wShowWindow = SW_NORMAL; ::CreateProcess(pfad.c_str(), _T(""), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
Meine Fehlermeldung:
DLLtest unter C++ mit Forms error C2039: 'CreateProcess': Ist kein Element von 'operator``global namespace'''
-
Wenn Du schon Windows-Forms verwendest würde ich Dir raten auch in der Managed-Welt zu bleichen und dann "Process::Start" verwenden.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdiagnosticsprocessclassstarttopic.aspDu kannst Dir natürlich auch die diversen Beispiele für CreateProcess ansehen, aber ich Rate Dir in diesem Fall davon ab...
Creating Processes: http://msdn.microsoft.com/library/en-us/dllproc/base/creating_processes.asp
-
Vielen dank für die ultraschnelle Antwort!!!
Nun würd ich das Selbe gerne mit einen Umweg durch eine dll machen.
d.h. Die DLL steht und ich kann auf Funktionen in der DLL zugreifen.int Test(char *arg1) { WinExec(arg1,SW_SHOW); return 1; }
Fehlermeldung:
TestDLL error LNK2019: Nicht aufgelöstes externes Symbol '"unsigned int __stdcall WinExec(char const *,unsigned int)" (?WinExec@@YGIPBDI@Z)', verwiesen in Funktion '"int __cdecl DLLCall(char *,char *)" (?DLLCall@@YAHPAD0@Z)'Wie kann ich die Funktion WinExec als extern deklarieren oder kann ich das irgendwie umgehen?
Ich sitz voll auf der Leitung
-
Eigentlich solltest Du gegen die kernel32.lib linken, dann dürfte die Meldung nicht kommen...
PS: Du hast aber mal die Doku zu WinExec gelesen, oder?Note This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function
Bzw. ich Rate Dir zu ShellExecute
http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp
-
Das mit der 16Bit-Version hab ich wohl übersehen.
Nur mit ShellExecute() hab ich den selben Fehler.
Habe auch die Headerdatei shellapi.h includet und die Import library shell32.lib gelinkt.TestDLL error LNK2019: Nicht aufgelöstes externes Symbol '"void * __stdcall ShellExecuteA(void *,char const *,char const *,char const *,char const *,int)" (?ShellExecuteA@@YGPAXPAXPBD111H@Z)', verwiesen in Funktion '"int __cdecl DLLCall(char *,char *)" (?DLLCall@@YAHPAD0@Z)'
-
Was für eine IDE verwendest Du denn? Ich vermute mal kein MS-VC, oder?
Du hast nämlich das ShellExecute als C++-Funktion deklariert. Das ist aber eine C-Funktion (extern "C").
-
Ich verwende eigendlich schon MS VC++.
Hättest du da nicht ein Beispiel dazu wie ich die ShellExecute oder auch eine andere Funktion in mein Prog. als c++ statt c-Funktion deklarieren könnte?
-
Normalerweise reicht es aus, wenn Du die windows.h einbindest... warum er bei Dir aber C++ macht ist mir Rätselhaft...
-
Kann ich der Funktion irgendwie explizit eintrichtern das sie in der shell32.lib zu finden ist?
Suchen tut sie nämlich nicht da, sondern in Headerdatei der DLL.
Fehlt da vielleicht noch was?//===> Header #ifdef TESTDLL_EXPORTS #define TESTDLL_API __declspec(dllexport) #else #define TESTDLL_API __declspec(dllimport) #endif class TESTDLL_API CTestDLL { public: CTestDLL(void); }; TESTDLL_API int DLLCall(char* arg1);
#include <windows.h> #include "stdafx.h" #include "TestDLL.h" #include "shellapi.h" #pragma comment(lib, "kernel32.lib") #pragma comment(lib, "shell32.lib") DLLCall(char* arg1) { ShellExecute(NULL, "open", arg1, NULL, NULL, SW_HIDE); return true; }
lounsome
-
Ich kann einen anderen Process starten, nur beendet sich der erste dann sofort.
Wie könnte ich das umgehen?char hilf01[] = "C:\\Progr.EXE"; char *args[] = {hilf01,"","",NULL}; execv(hilf01,args); //auch bei anderen Varianten von exec und spawn
-
Verwende CreateProcess und warte auf das Process-Handle.
Du kannst auch spawn mit _P_WAIT verwenden... oder system...
-
Vielen Dank Jochen hast mir sehr geholfen!
Hätte nur noch eine Frage:
Was könnte im schlimmsten Fall passieren, wenn ich eine 16-Bit Funktion auf `ner 32-Bit Umgebung nutze?spawnv(P_WAIT,.....);
ist ja eine 16-Bit-Funktion. Oder?
-
Wie kommst Du auf die Idee, dass dies eine 16-Bit Funktion ist?
Es ist eine CRT Funktion...
-
OK,
Hab ich nicht gewusst.