C ++ CreateProcess - 系统错误#2无法找到文件 - 我的文件路径出了什么问题?

时间:2013-09-15 05:54:55

标签: c++ windows

我正在尝试使用CreateProcess()通过Firefox打开PDF,我是初学者,对使用CreateProcess一无所知,但在我的上一个问题中,有人指出了它上面的MSDN ...它表明:

To run a batch file, you must start the command interpreter; 
set lpApplicationName to    cmd.exe and set lpCommandLine to the 
following arguments: /c plus the name of the batch file.

因此,我使用system()命令创建了一个完全正常运行的批处理文件,批处理文件没有问题。

我无法弄清楚为什么系统无法找到该文件,我不知道它是批处理文件,批处理文件中的exe,批处理文件中的PDF文档还是{{{ 1}} ...非常感谢任何帮助...

cmd.exe

1 个答案:

答案 0 :(得分:2)

这假设整个批处理文件是XY问题的一部分,因为你真的不需要制作批处理文件,你真的只想用命令行参数启动Firefox。

我还假设你真的不需要传递整个文件名数组和一个索引供你使用,而你应该像我在调用函数时一样传递文件名。

#include <Windows.h>
#include <stdio.h>

void MsgBoxLastError()
{
    LPWSTR lpMsgBuf = NULL;
    if(FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPWSTR)&lpMsgBuf,
        0, NULL ) != 0)
    {
        MessageBox(NULL, lpMsgBuf, L"Error", MB_OK);
    }
    LocalFree(lpMsgBuf);
}

void OpenWithFirefox(const char* Filename)
{
    const WCHAR pathToFirefox[] = L"C:/Program Files (x86)/Mozilla Firefox/firefox.exe";
    const WCHAR scanPrefix[] = L"file://C:/Scans/";
    WCHAR fullCommandLine[MAX_PATH] = {0};

    //Build full command line
    swprintf_s(fullCommandLine, L"\"%s\" \"%s%S\"", pathToFirefox, scanPrefix, Filename);

    STARTUPINFOW si; 
    PROCESS_INFORMATION pi; 
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );
    BOOL success = CreateProcess(NULL, fullCommandLine, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
    if(success)
    {
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }
    else
    {
        MsgBoxLastError();
    }
}

int main()
{
    const int MAX_NAME = 13;
    char scansQueue[][MAX_NAME] =
    {
        "file1.pdf",
        "file2.pdf"
    };

    for(int i = 0; i < 2; ++i)
    {
        OpenWithFirefox(scansQueue[i]);
    }
    return 0;
}