【发布时间】:2019-07-14 13:59:45
【问题描述】:
我正在尝试使用CreateProcess() 打开一个*.jpg 文件,并且我希望CreateProcess() 的行为与使用ShellExecute() 打开*.jpg 时的行为完全相同。 p>
所以我首先使用FindExecutable() 来获取*.jpg 文件的查看器应用程序,然后我连接查看器应用程序的路径和*.jpg 文件的路径,添加引号以确保它适用于具有其中的空格。
但是,结果不一样:在我的系统上,*.jpg 文件与具有轻量级查看器模式和更复杂的编辑器模式的应用程序相关联。当我使用ShellExecute() 打开文件(或在资源管理器中双击它)时,查看器应用程序以轻量级查看器模式打开。但是,当我如上所述使用CreateProcess() 时,查看器应用程序也会显示*.jpg 文件,但它会以编辑器模式打开。
所以ShellExecute() 一定是在做其他事情,导致查看器应用程序的行为与它一样,但我不知道是什么。使CreateProcess() 的行为与ShellExecute() 完全相同可能缺少什么想法?
这是当前代码的样子:
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
memset(&piProcInfo, 0, sizeof(PROCESS_INFORMATION));
memset(&siStartInfo, 0, sizeof(STARTUPINFO));
siStartInfo.cb = sizeof(STARTUPINFO);
CreateProcess(NULL, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &siStartInfo, &piProcInfo);
【问题讨论】:
-
ShellExecute托管 几十年 的兼容性垫片。试图准确地复制它的行为要么几乎是不可能的,要么是不合法的。 -
我什至可能不需要完全复制它的行为,我只是想知道为什么查看器应用程序会这样,以及是否有办法让它的行为就像文件是通过
ShellExecute()启动的一样. -
“我希望
CreateProcess()的行为完全与使用ShellExecute()打开*.jpg时的行为相同。” - 如果你不这样做不想这样,不要要求。无论如何,如果ShellExecute有一个内部应用程序列表来决定最合适的应用程序,我不会太惊讶,因为应用程序匹配同样合适。 -
为什么不能使用
ShellExecute/ShellExecuteEx?您要解决的实际问题是什么? -
@zet:不使用
ShellExecute[Ex]的一个原因是,如果您从一个初始化为多线程单元的线程调用它。当然,这可以通过在问题上抛出另一个线程来解决,但这可能不可行。
标签: winapi