如何从Jscript文件加载DLL文件?

时间:2014-11-30 13:12:08

标签: dll jscript

所以我正在编写一个由JScript执行的独立Windows Script Host文件(此文件不会用作Web应用程序)。

我的目标是加载一个dll文件。就像在C++应用程序中使用LoadLibrary function一样。

我尝试过研究这个主题,但我没有想出任何有用的东西。我迷失了,我没有任何代码可以分享。我理解使用ActiveXObject可能会让我解脱。如果是这样,任何想法如何使用它?

更新

如果我们都同意加载是不可能的,我会接受有效性检查。意思是,不要尝试加载但检查它是否已加载且功能正常。

3 个答案:

答案 0 :(得分:1)

您可以为此目的导出特定功能。 然后,从JScript中,执行 rundll32.exe 并检查该函数是否按预期运行。

答案 1 :(得分:1)

你也可以给Gilles Laurent's DynaWrap ocx a chance。

这种dll需要在目标系统上注册,如regsvr32 /s DynaWrap.dll

它仅限于32位DLL,这可能不方便您使用,但它适用于64位Windows。您无法访问由序号导出的函数,也无法直接处理64位或更大的值/指针。

以下是从JScript调用MessageBoxA的示例:

var oDynaWrap = new ActiveXObject( "DynamicWrapper" )

// to call MessageBoxA(), first register the API function
oDynaWrap.Register( "USER32.DLL", "MessageBoxA", "I=HsSu", "f=s", "R=l" )

// now call the function
oDynaWrap.MessageBoxA( null, "MessageBoxA()", "A messagebox from JScript...", 3 )

这里来自VBScript:

Option Explicit
Dim oDynaWrap
Set oDynaWrap = CreateObject( "DynamicWrapper" )

' to call MessageBoxA(), first register the API function
UserWrap.Register "USER32.DLL", "MessageBoxA", "I=HsSu", "f=s", "R=l"

' now call the function
UserWrap.MessageBoxA Null, "MessageBoxA()", "A messagebox from VBScript...", 3

要使用函数,您需要“注册”DLL的导出函数。 要做到这一点,你需要调用register方法,第一个参数包含DLL的完整路径的字符串对象,第二个参数用于要使用的函数的导出名称,以及以下三个参数描述函数声明以某种方式模糊的语法。

i=描述了函数参数的数量和数据类型。

f=描述了通话类型:_stdcall_cdecl。默认为_stdcall

r=描述了返回值数据类型。

支持的数据类型为:

Code  Variant      Description

a     VT_DISPATCH  IDispatch*
b     VT_BOOL      BOOL
c     VT_I4        unsigned char
d     VT_R8        8 byte real
f     VT_R4        4 byte real
h     VT_I4        HANDLE
k     VT_UNKNOWN   IUnknown*
l     VT_I4        LONG
p     VT_PTR       pointer
r     VT_LPSTR     string by reference
s     VT_LPSTR     string
t     VT_I2        SHORT
u     VT_UINT      UINT
w     VT_LPWSTR    wide string

因此,示例中使用的Register方法调用描述了MessageBoxA,如下所示:

_stdcall LONG MessageBoxA( HANDLE, LPSTR, LPSTR, UINT );

有关MessageBoxA的说明,请查看MSDN上的文档。

请阅读 DynaWrap 文档以获取更复杂的示例...但您可能需要Google翻译,“因为它们是用法语写的; - )

答案 2 :(得分:0)

为了能够将dll用作ActiveXObject,它必须是registered as COM object。这有一些限制,但如果你有这个DLL的代码,它肯定是可行的。

当您将dll注册为COM对象时,会为其分配一个名称。您使用此名称来创建对象。此example from MSDN使用excel,因为如果您安装了办公室,它已经注册。

var ExcelApp = new ActiveXObject("Excel.Application");
var ExcelSheet = new ActiveXObject("Excel.Sheet");
// Make Excel visible through the Application object.
ExcelSheet.Application.Visible = true;
// Place some text in the first cell of the sheet.
ExcelSheet.ActiveSheet.Cells(1,1).Value = "This is column A, row 1";
// Save the sheet.
ExcelSheet.SaveAs("C:\\TEST.XLS");
// Close Excel with the Quit method on the Application object.
ExcelSheet.Application.Quit();

除了注册dll的限制之外,使用dll与将其用作c ++或c#dll没有什么不同。请注意,C#(或其他.NET dll)应该以ComVisible方式从javascript中使用。

编辑:从javascript使用C / C ++ dll的唯一方法是swig接口。我没有用它,所以我只能指出你那个方向。

  SWIG是一个连接程序的软件开发工具   C和C ++具有各种高级编程语言。 SWIG是   用于不同类型的目标语言,包括常见语言   脚本语言,如Javascript,Perl,PHP,Python,Tcl和   红宝石。