0

我正在尝试创建一个函数,该函数在 Firefox 中打开一个与主进程分开的 PDF。我相信我在使用 createProcess 的参数时遇到问题......非常感谢任何帮助

编辑:正在创建批处理文件,我已经对其进行了多次测试,并解释一下:批处理文件是因为我真的不知道自己在做什么,我是计算机科学专业的学生,​​这是一方面项目来帮助我的工作。我在一家律师事务所工作,并在邮件收到时以电子方式归档。我想制作一个简单的程序,该程序将遍历扫描目录,显示扫描并提示用户输入有关文档的信息。因此我需要能够动态地构建文件路径。最初我是使用“系统”来打开 Firefox 并显示文档。经过一番尝试,我让它与批处理文件一起工作。然后我了解到 system 是一个阻塞命令,我需要启动一个单独的线程。这是我遇到createprocess的地方。

void openPDF(char scansQueue[][MAX_NAME], int index)
{
// build bat file
fstream outfile;
outfile.open("C:\\firefox.bat");    
if(outfile.good())cout<<"outfile good!!!!"<<endl;
outfile<<"\"C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe\" \"C:\\Scans\\"   <<scansQueue[index]<<"\"";

STARTUPINFOW si; 
PROCESS_INFORMATION pi; 
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if(!CreateProcess(NULL, L"C:\\firefox", NULL, NULL, false, 0, NULL, NULL, &si, &pi))cout<<"PROCESS FAILED TO EXECUTE!!!";
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

}
4

1 回答 1

2

这段代码有几个问题。评论中已经指出了一些(在失败时关闭可能无效的句柄,无法创建批处理文件的可能性,以及相当有问题的命令行)。这里还有几个问题。

首先,您不能以这种方式运行批处理文件。

文档明确CreateProcess指出:

要运行批处理文件,您必须启动命令解释器;将lpApplicationName设置为 cmd.exe 并将lpCommandLine设置为以下参数:/c 加上批处理文件的名称。

其次,您正在传递一个字符串文字 for lpCommandLine,这也被文档明确禁止:

lpCommandLine [输入,输出,可选]

...

此函数的 Unicode 版本CreateProcessW可以修改此字符串的内容。因此,此参数不能是指向只读内存的指针(例如const变量或文字字符串)。如果此参数是一个常量字符串,该函数可能会导致访问冲突。

最后,为什么要创建一个临时批处理文件来运行单个命令?您可以轻松编写CreateProcess直接启动 Firefox 的调用。

于 2013-09-14T07:53:20.087 回答