2012-04-02 86 views
2

我今天早些时候刚刚问过一个问题,因为我想运行一个可执行文件,该文件从我的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,不给我一个错误消息。

我希望这段代码可以帮助...我没有想看看它进一步,因为它好像我是不是即使是在正确的方向前进。而不是系统

+3

请显示无法使用的代码(使用'CreateProcess')。 – zwol 2012-04-02 02:46:30

+0

“但它并不能解决我的问题,因为cmd显示出来,并且通过重新测试,我确实发现cmd甚至不运行.exe”。你的意思是即使'CreateProcess'没有生成指定的.exe文件,命令提示符窗口出现?如果是这样的话,这听起来像你的主要可执行文件被编译为控制台应用程序,而不是窗口化的应用程序。 – jamesdlin 2012-04-02 03:37:00

+0

@jamesdlin由于_getch();我得到一个空的黑色控制台窗口,但我看到它看起来是空的,如果我删除了_getch();它就会消失。这听起来很愚蠢,但我不确定你的评论是什么意思。我使用的是Visual Studio 2010,并且不知道编译选项,我总是选择创建空项目(或者为具有GUI的项目创建Qt4项目)。如果你的意思是我的编译器不能像编译它那样,你能解释一下怎么做吗?我知道这听起来不太流行,但通常我会制作小型控制台应用程序或使用Qt自制代码。 – 2012-04-02 03:43:07

回答

0

使用CreateProcess

- 编辑 -

为CreateProcess的,我试过的代码是什么,我发现这个网址:

的代码是一个烂摊子,我建议,以避免网址在未来。

在“CreateProcess”文章末尾是一个名为“Creating Processes"”的链接,其中包含更简单的示例,它更易于阅读,将其用作起点。

+3

他说他试过了。请更具体一些。 – zwol 2012-04-02 02:46:07

+3

@SigTerm:如果你的回答没有进一步说明OP的知识,那么它“没有用”,并且需要一个downvote。写一个很好的答案的负担不是在离开评论的人... – ildjarn 2012-04-02 03:03:02

+0

@SigTerm感谢您尝试提供帮助,但使用我在OP中编辑的代码尝试CreateProcess时,我仍然遇到同样的问题,并且我看到了之前链接。我尝试了一些我可以在其他地方找到的示例代码,因为我没有完全理解该链接中的所有参数,这就是为什么我想要一个正确方向的示例或推荐,以便我可以走在正确的道路上。至少现在我知道CreateProcess是正确的方法。 – 2012-04-02 03:10:41

0

增加对siStartupInfo以下行后,cmd窗口不会弹出任何更多与我自己的测试* .exe文件。

siStartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; 
siStartupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE); 
siStartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
siStartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE); 
siStartupInfo.wShowWindow = SW_HIDE; 

但我有另一个问题。当我尝试运行一些其他的可执行文件,它的命令行是

TEST.exe <input-file> output-file 

在cmd窗口,WaitForSingleObject的()返回258,并且GetLastError()返回1813(“指定的资源类型不能在图像中找到文件。”)。 有关更多详细信息,请参见system() and CreateProcess()/CreateProcessW()

任何想法将不胜感激!

+1

我的问题解决与RemyLebeau的指令 在http://stackoverflow.com/questions/8649212/createprocess-and-command-line-arguments – dehiker 2012-04-02 09:04:11

0

我发现如何执行外部程序的唯一途径是: 系统(“启动C:\文件路径\文件”); 唯一的问题是文件或目录不能有空格。

相关问题