我有一个在浏览器上运行的 javascript。是否可以在 user32.dll 中调用函数/方法。
这可以通过使用 pInvoke 调用从 C# 中实现。我如何在 JavaScript 中做同样的事情?
谢谢,
达特
我有一个在浏览器上运行的 javascript。是否可以在 user32.dll 中调用函数/方法。
这可以通过使用 pInvoke 调用从 C# 中实现。我如何在 JavaScript 中做同样的事情?
谢谢,
达特
由于 JavaScript 沙箱,如果没有需要提升安全权限的中间层,例如 Netscape 风格的浏览器插件(广泛支持)、ActiveX 控件(几乎仅限 IE)或 .Net 控件,您就无法做到这一点(我认为这是可能的;同样可能仅限 IE)。在每种情况下,JavaScript 都会与控件对话,这反过来会为您调用 USER32。
如果用户没有授予您的应用程序提升的权限,这些都不会起作用,但我猜您需要 Windows,这适用于某种可能的 Intranet 应用程序。
您肯定需要在客户端上安装您自己的插件、扩展或 ActiveX。
对于 firefox 扩展,您可以使用jsctypes轻松包装调用。
如果您使用 Firefox 4 中包含的 Jetpack API,它将全部是 JavaScript,甚至不需要重新启动浏览器。
这是 mozilla.org 的一个基本 Hello World 示例:
/* Load JS Ctypes Javascript module */
require("chrome").Cu.import("resource://gre/modules/ctypes.jsm");
/* Load windows api dll */
var lib = ctypes.open("user32.dll");
/* Declare the signature of the function we are going to call */
var msgBox = lib.declare("MessageBoxW",
ctypes.stdcall_abi,
ctypes.int32_t,
ctypes.int32_t,
ctypes.ustring,
ctypes.ustring,
ctypes.int32_t);
var MB_OK = 3;
/* Do it! */
var ret = msgBox(0, "Hello world", "title", MB_OK);
/* Display the returned value */
alert("MessageBox result : "+ret);
lib.close();
在客户端 - 出于安全原因,这是不可能的(想象每个站点都可以在您的计算机上运行系统命令......世界末日 - 可能使用 ActiveX,但这只是 IE,但话又说回来,DLL 只是 Windows )。
如果你想在服务器上运行它,你需要通过 AJAX 和 C#。
使用网页中的 javascript 在客户端计算机上运行 dll 方法?这就是要引发天启的原因。
如果您使用 C# 构建自己的 Web 浏览器,则可以拦截 JavaScript 调用并将它们转换为浏览器中所需的任何内容。尽管如果您希望它可用于其他浏览器,那将无法正常工作。
编写一个 com 对象来包装您对 user32 的调用。在 IE/javascript 中调用它。您的 DynamicWrapperX 对象将为此工作(它将是那个 com 对象,允许您根据需要调用您的 dll)。