Я только что задал вопрос ранее сегодня, потому что я хотел запустить исполняемый файл, который получает параметры из моего кода C ++, и он не работал.
Это работает сейчас, но у меня все еще есть проблемы, так какЯ думал, что поступаю правильно, но кажется, что то, чего я хочу достичь, не может быть достигнуто так, как я к нему подхожу ...
Это мой исправленный код из моего другого вопроса:
#include <stdlib.h>
#include <conio.h>
int main (){
system("\"\"C:\\Users\\Adam\\Desktop\\pdftotext\" -layout \"C:\\Users\\Adam\\Desktop\\week 4.pdf\"\"");
_getch();
}
что я запускаю "pdftotext -layout myfile.pdf", как будто я запускаю его из окна CMD.
Дело в том, что я на самом деле не хочуcmd, чтобы показать, так как у меня есть интерфейс GUI поверх него, и я хочу отобразить более приятный индикатор выполнения вместо того, чтобы видеть всплывающие окна для каждого файла, который мне нужно проанализировать.
Я посмотрел вокруг и либоЯ не понимаю, что я читаю, так как я относительно новичок в C ++, или я просто не нашел то, что искал.Я обнаружил, что с помощью CreateProcess я смог бы сделать это, но после копирования некоторого кода, который я нашел в другом месте, окно cmd все равно всплывает.
Мне бы хотелось, чтобы кто-то мог дать мне имяфункции, которую я мог бы использовать для выполнения чего-то подобного, или если бы кто-то мог дать пример кода для этого небольшого случая в коде, который я разместил, так как я не уверен, что понимаю все как следует, будучи новичком в C ++ и всем.
Редактировать: В соответствии с просьбой в комментарии, код для CreateProcess, который я пробовал, - это то, что я нашел по этому URL:
http://www.goffconcepts.com/techarticles/development/cpp/createprocess.html
(с моими собственными параметрами, которые, я думаю, должны идти туда):
#include <windows.h>
#include <string>
#include <conio.h>
size_t ExecuteProcess(std::wstring FullPathToExe, std::wstring Parameters, size_t SecondsToWait)
{
size_t iMyCounter = 0, iReturnVal = 0, iPos = 0;
DWORD dwExitCode = 0;
std::wstring sTempStr = L"";
/* - NOTE - You should check here to see if the exe even exists */
/* Add a space to the beginning of the Parameters */
if (Parameters.size() != 0)
{
if (Parameters[0] != L' ')
{
Parameters.insert(0,L" ");
}
}
/* The first parameter needs to be the exe itself */
sTempStr = FullPathToExe;
iPos = sTempStr.find_last_of(L"\\");
sTempStr.erase(0, iPos +1);
Parameters = sTempStr.append(Parameters);
/* CreateProcessW can modify Parameters thus we allocate needed memory */
wchar_t * pwszParam = new wchar_t[Parameters.size() + 1];
if (pwszParam == 0)
{
return 1;
}
const wchar_t* pchrTemp = Parameters.c_str();
wcscpy_s(pwszParam, Parameters.size() + 1, pchrTemp);
/* CreateProcess API initialization */
STARTUPINFOW siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()),
pwszParam, 0, 0, false,
CREATE_DEFAULT_ERROR_MODE, 0, 0,
&siStartupInfo, &piProcessInfo) != false)
{
/* Watch the process. */
dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000));
}
else
{
/* CreateProcess failed */
iReturnVal = GetLastError();
}
/* Free memory */
delete[]pwszParam;
pwszParam = 0;
/* Release handles */
CloseHandle(piProcessInfo.hProcess);
CloseHandle(piProcessInfo.hThread);
return iReturnVal;
}
int main(void){
ExecuteProcess(L"C:\\Users\\Adam\\Desktop\\pdftotext", L"-layout \"C:\\Users\\Adam\\Desktop\\week 4.pdf\"", 0);
_getch();
}
Я немного ошеломлен, поскольку он использует некоторые вещи, которые я никогда раньше не использовал, но я думаю, что понимаю ядро (ключевое слово: думаю ).Тем не менее, это не решает мою проблему, потому что cmd обнаруживается и при повторном тестировании я действительно заметил, что cmd даже не запускает .exe и не выдает мне сообщение об ошибке.
Iнадеюсь, что этот фрагмент кода поможет ... Я не хотел вдаваться в подробности, так как казалось, что я даже не двигался в правильном направлении.