你也可以给Gilles Laurent's DynaWrap
抓住机会。
这种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 翻译,因为它们是用法语编写的 ;-)