从NPAPI插件中启动外部应用程序

时间:2010-05-17 08:19:30

标签: winapi plugins shellexecute npapi createprocess

我想弄清楚为什么我编写的NPAPI插件,在执行通过Javascipt调用触发的操作方面工作正常,不能使用CreateProcess()或ShellExecute()从通过Javascript指定的路径启动应用程序呼叫。

我似乎可以使用这些方法中的任何一种并返回成功,即没有错误代码。但该应用程序只是没有启动。我已经尝试修改调用它们时使用的参数,创建新的进程组等。但看似没有效果。

我知道这可能看起来有点安全风险,但出于非常具体的目的,我们希望使用它,因为它应该不是问题。

使用Windows XP Pro SP3,Firefox 3.5和以下代码:

ZeroMemory( &si, sizeof(si) ); 
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) ); 
if( CreateProcess( NULL, wFileName, NULL, NULL, FALSE, 
                  CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP, 
                  NULL, NULL, &si, &pi ) )
{ 
    bSuccess = true; // Close process and thread handles.      
    WaitForSingleObject(pi.hProcess,INFINITE); 
    CloseHandle( pi.hProcess ); 
    CloseHandle( pi.hThread ); 
}

1 个答案:

答案 0 :(得分:0)

没有任何代码(片段)来咀嚼它真的很难给出有价值的提示:

我不明白为什么这不适用于XP。 你确定CreateProcess()/ ShellExecute()调用成功吗?

要尝试的事情:

  • 如果传递无效路径,ShellExecute()调用是否也会成功?

  • 如果使用硬编码路径会发生什么(例如notepad.exe的路径,没有空格的路径等)?

  • 使用ProcessMonitor(以前的filemon)检查您尝试启动的应用程序的可执行文件是否已加入。

可能无法启动可执行文件,因为找不到依赖DLL 请记住,工作/当前目录是从插件中启动应用程序时浏览器可执行文件的目录 因此,可能找不到位于应用程序文件夹中的DLL。