我今天早些时候刚刚问过一个问题,因为我想运行一个可执行文件,该文件从我的C++代码中获取参数并且它不工作。如何在没有在Windows中显示cmd窗口的情况下使用参数运行外部程序?
它现在,但我仍然有问题,因为我以为我要对这个正确的方式,但它似乎像什么,我要完成不能做我接近它的方式.. 。
这是我的其他问题我纠正代码:
#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窗口。
我想,如果有人可以给我一个功能,我可以用它来完成这样的事情,或者如果有人可以提供一些示例代码中我张贴的代码这种小case,因为我不知道的名字我理解我应该做的一切,对C++和所有人都是新手。
编辑:作为评论的要求,针对CreateProcess的,我试过的代码是什么,我发现这个网址:
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')。 – zwol 2012-04-02 02:46:30
“但它并不能解决我的问题,因为cmd显示出来,并且通过重新测试,我确实发现cmd甚至不运行.exe”。你的意思是即使'CreateProcess'没有生成指定的.exe文件,命令提示符窗口出现?如果是这样的话,这听起来像你的主要可执行文件被编译为控制台应用程序,而不是窗口化的应用程序。 – jamesdlin 2012-04-02 03:37:00
@jamesdlin由于_getch();我得到一个空的黑色控制台窗口,但我看到它看起来是空的,如果我删除了_getch();它就会消失。这听起来很愚蠢,但我不确定你的评论是什么意思。我使用的是Visual Studio 2010,并且不知道编译选项,我总是选择创建空项目(或者为具有GUI的项目创建Qt4项目)。如果你的意思是我的编译器不能像编译它那样,你能解释一下怎么做吗?我知道这听起来不太流行,但通常我会制作小型控制台应用程序或使用Qt自制代码。 – 2012-04-02 03:43:07