所以我正在编写一个由JScript
执行的独立Windows Script Host
文件(此文件不会用作Web应用程序)。
我的目标是加载一个dll文件。就像在C++
应用程序中使用LoadLibrary function一样。
我尝试过研究这个主题,但我没有想出任何有用的东西。我迷失了,我没有任何代码可以分享。我理解使用ActiveXObject
可能会让我解脱。如果是这样,任何想法如何使用它?
如果我们都同意加载是不可能的,我会接受有效性检查。意思是,不要尝试加载但检查它是否已加载且功能正常。
答案 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和 红宝石。