Я только что задал вопрос ранее сегодня, потому что хотел запустить исполняемый файл, который берет параметры из моего кода 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 отображался, так как у меня есть графический интерфейс поверх него, и я хочу отображать более приятный индикатор выполнения вместо того, чтобы видеть всплывающие окна для каждого файла, который мне нужно проанализировать.
Я огляделся и либо не понимаю, что читаю, так как я относительно новичок в 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 и не выдает мне сообщение об ошибке.
Я надеюсь, что этот фрагмент кода поможет... Я не хотел углубляться в это, так как казалось, что я даже не двигался в правильном направлении.
CreateProcess
), который не работает. - person zwol   schedule 02.04.2012CreateProcess
не создает указанный файл .exe? Если это так, то похоже, что ваш основной исполняемый файл скомпилирован как консольное приложение, а не как оконное. - person jamesdlin   schedule 02.04.2012siStartupInfo.dwFlags = STARTF_USESHOWWINDOW;
иsiStartupInfo.wShowWindow = SW_HIDE;
перед вызовомCreateProcess
. - person Jesse Good   schedule 02.04.2012/SUBSYSTEM:WINDOWS
, если вы не хотите, чтобы у него было окно консоли. Также см. stackoverflow.com/questions/2422430/ - person jamesdlin   schedule 02.04.2012