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

Posted

技术标签:

【中文标题】从 NPAPI 插件中启动外部应用程序【英文标题】:Launching an external application from within a NPAPI Plugin 【发布时间】:2010-05-17 08:19:30 【问题描述】:

我正在尝试弄清楚为什么我编写的 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 ); 

【问题讨论】:

什么浏览器和windows版本? Windows XP Pro SP3 和 Firefox 3.5 【参考方案1】:

没有任何代码 (sn-p) 来咀嚼,真的很难给出有价值的提示:

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

要尝试的事情:

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

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

使用 ProcessMonitor(以前的 filemon)检查您尝试启动的应用程序的可执行文件是否被访问。

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

【讨论】:

我用无效的路径尝试过,在这种情况下它肯定会返回错误,我也按照你的建议尝试过,只是硬编码它以打开记事本之类的东西,但没有成功。我也在使用绝对路径,所以当前目录是什么目录无关紧要。我将看看进程监视器以​​防万一。谢谢。 depends.exe 在极少数情况下为我创造了奇迹 - 在 FF 的跟踪模式下使用它可以提供有关失败的系统调用的更多信息。 尝试在简单的控制台应用程序中运行相同的代码,它启动 exe 很好,似乎与尝试从 DLL 中启动它有关?不知道如何使用depends.exe 来执行您所说的操作,您能否提供执行此操作的步骤?谢谢。 @Adam: File->Open 并加载 firefox.exe,然后 Profile->Start Profiling,设置参数,这样你的测试页就是立即加载,等等......

以上是关于从 NPAPI 插件中启动外部应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Flash / Java Applet 的 NPAPI 插件的替代品

我正在寻找一个 NPAPI 插件吗?

Firefox [npapi] 插件开发 - 调用方法时 Firefox 冻结

仅使用 Firefox Addon SDK 在后台嵌入 NPAPI 插件

从任何外部应用程序启动编辑器窗口时,Outlook插件不会显示

高版本号chrome安装flashplayer debuger后无法使用的问题