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

如何从Jscript文件加载DLL文件?,dll,jscript,Dll,Jscript,因此,我正在编写一个独立的JScript文件,由Windows脚本主机执行(该文件不会用作web应用程序) 我的目标是加载一个dll文件。就像在C++应用程序中使用一样 我试着研究这个课题,但没有找到任何有用的东西。我太迷茫了,没有任何代码可以分享。我明白使用ActiveXObject可能会帮助我。如果是的话,你知道如何使用它吗 更新: 如果我们都同意装货是不可能的,我就接受有效性检查。也就是说,不要尝试加载,而是检查它是否已加载且功能正常。要能够将dll用作ActiveXObject,它必须是

因此,我正在编写一个独立的
JScript
文件,由
Windows脚本主机执行(该文件不会用作web应用程序)

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

我试着研究这个课题,但没有找到任何有用的东西。我太迷茫了,没有任何代码可以分享。我明白使用
ActiveXObject
可能会帮助我。如果是的话,你知道如何使用它吗

更新:
如果我们都同意装货是不可能的,我就接受有效性检查。也就是说,不要尝试加载,而是检查它是否已加载且功能正常。

要能够将dll用作ActiveXObject,它必须是。这方面有一些限制,但如果您有此dll的代码,它肯定是可行的

将dll注册为COM对象时,会为其指定一个名称。您可以使用此名称创建对象。这将使用excel,因为如果安装了office,它已经注册

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.Y.DLL没有什么不同。请注意,C#(或其他.NET DLL)应该以这种方式从javascript中使用

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

SWIG是一种软件开发工具,用于连接以 用C++和C++高级语言编写的各种高级语言。大口大口 用于不同类型的目标语言,包括通用语言 脚本语言,如Javascript、Perl、PHP、Python、Tcl和 鲁比


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

您还可以给出 ocx是一个机会

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

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

下面是一个从JScript调用
MessageBoxA
的示例:

var oDynaWrap=新的ActiveXObject(“DynamicRapper”)
//要调用MessageBoxA(),首先注册API函数
寄存器(“USER32.DLL”、“MessageBoxA”、“I=HsSu”、“f=s”、“R=l”)
//现在调用函数
MessageBoxA(null,“MessageBoxA()”,“来自JScript的messagebox…”,3)
这里来自VBScript:

选项显式
暗奥德纳瓦普
设置oDynaWrap=CreateObject(“dynamicRapper”)
'要调用MessageBoxA(),请首先注册API函数
UserWrap.Register“USER32.DLL”、“MessageBoxA”、“I=HsSu”、“f=s”、“R=l”
'现在调用函数
UserWrap.MessageBoxA Null,“MessageBoxA()”,“VBScript中的messagebox…”,3
要使用函数,需要“注册”DLL的导出函数。 为此,您需要调用register方法,第一个参数包含指向DLL完整路径的string对象,第二个参数用于要使用的函数的导出名称,接下来的三个参数以某种模糊的语法描述函数declaration

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

f=
描述调用类型:
\u stdcall
\u cdecl
。默认设置为
\u 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
的描述如下:

\u stdcall LONG MessageBoxA(句柄、LPSTR、LPSTR、UINT);
有关MessageBoxA的说明,请参阅上的文档


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

10倍的帮助。然而,这个答案并不能帮助我以任何方式解决我的问题。我很清楚如何使用
ActiveXObject
,所以这个例子对我没有帮助。如果你有一段加载DLL的JScript代码,请分享。我不明白如果你的DLL不是ActiveX,为什么你认为这样的事情是可能的。@manuell我不认为这是可能的。我希望是(在某种程度上)。我会接受任何令人信服的回答,说这是不可能的。你是在使用nodejs还是什么?只是在使用
Windows脚本主机运行的plian
JScript