Решение: "
ShellAndWait(NULL, _FinalShellStrCmd, "WAIT", 240, 1);
Используя stringstream, чтобы объединить App и Arg в _FinalShellStrCmd, оставьте первый аргумент равным NULL. Он работал нормально с прямой или обратной косой чертой. Еще раз спасибо.
Я использую повышение, чтобы получить текущий путь, затем я получаю "d: / bin / test.Теперь я пытаюсь вызвать ShellAndWait () ниже с помощью библиотечной функции CreateProcess ().С обратной косой чертой "\ в пути к каталогу, например .. d: \ bin \ test. Это работает как charm.
У меня есть распечатка пути к приложению и аргументы для приглашения dos, затем я копирую их и вставляю в dosподсказка, она выполнена ОК. Пример, D: /bin/test/test.exe d: /bin/test/test.dat путь к приложению args
, если я добавлю путь к приложению и аргументы в функцию ShellWandWaitниже, и он ничего не сделал. Я подозреваю, что CreateProcess () не будет принимать путь или каталог с косой чертой "/". Кто-нибудь подскажет мне немного здесь? Спасибо еще раз.
int BasicExcelCell::ShellAndWait(char *AppName, char *AppArgument, char *Wait, DWORD TimeOut=0, DWORD IgnoreErrorFlag=0)
{
PROCESS_INFORMATION ProcessInfo; //This is what we get as an [out] parameter
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
TimeOut = TimeOut * 1000;
if (Wait == "NOWAIT")
ShellExecute(NULL,"open",AppName, AppArgument," ", SW_SHOW );
else //WAIT
{
//printf("ShellExecute WAIT\n");
printf("Appname:%s AppArgs:%s\n", AppName, AppArgument);
UINT olderrormode;
if (IgnoreErrorFlag)
{
olderrormode = SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX);
}
if (CreateProcess(AppName, AppArgument,
NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
std::cout<<"WaitingSingleOjbec"<<endl;
DWORD dwret = WaitForSingleObject(ProcessInfo.hProcess,TimeOut);
switch (dwret)
{
case WAIT_OBJECT_0:
break;
case WAIT_TIMEOUT:
default:
TerminateProcess(ProcessInfo.hProcess,0);
break;
}
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
if (IgnoreErrorFlag)
{
SetErrorMode(olderrormode);
}
}
return 0;
}