idanshmu
idanshmu

Reputation: 5271

How to load DLL file from Jscript file?

So I'm writing a standalone JScript file to be executed by Windows Script Host (this file is not going to be used as a web application).

My goal is to load a dll file. Just like using LoadLibrary function in a C++ application.

I tried researching the subject but I didn't come up with anything useful. I'm so lost I don't have any piece of code to share. I understand using ActiveXObject may come to my rescue. if so, any idea how to use it?

Update:

If we all agree that loading is impossible, I'll settle for validity check. Meaning, don't try to load but check if it is loaded and functional.

Upvotes: 8

Views: 9715

Answers (3)

rogepa
rogepa

Reputation: 53

You might also give Gilles Laurent's DynaWrap ocx a chance.

This kind of dll needs to be registered on the target system like regsvr32 /s DynaWrap.dll.

It is restricted to 32-bit DLLs, and this might be inconvenient for you to use, but it works on a 64bit Windows. You can't access function exported by ordinal number and you can't directly handle 64bit or greater values/pointers.

Here's a sample to call MessageBoxA from JScript:

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 )

And here from 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

To use a function you need to "register" the exported function of your DLL. To do this you need to call the register method with a first parameter containing a string object to the complete path of the DLL, a second parameter for the exported name of the function to use, and following three paremeters describing the functions declartion in a somehow obscure syntax.

i= describes the number and data type of the functions parameters.

f= describes the type of call: _stdcall or _cdecl. Default to _stdcall.

r= describes the return values data type.

The supported data types are:

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

Thus the Register method call used in the examples describes MessageBoxA like this:

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

For a explanation of MessageBoxA look at the docs on MSDN.

Please read the DynaWrap docs for more sophisticated examples... But you might need Google translate, 'cos they are written in french ;-)

Upvotes: 3

GoodLife
GoodLife

Reputation: 158

You can export a specific function for this purpose. Then, from your JScript, execute rundll32.exe and check that the function ran as expected.

Upvotes: 3

Atilla Ozgur
Atilla Ozgur

Reputation: 14721

To be able to use a dll as ActiveXObject, it needs to be registered as COM object. There are some restrictions on this but if you have a code for this dll, it is certainly doable.

When you register your dll as COM object, it is assigned a name. You use this name to create an object. This example from MSDN uses excel since it is already registered if you installed 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();

Apart from restriction of registering dll, using dll is no different from using it as c++ or c# dll. Note that, C# (or other .NET dlls) should be ComVisible to be used from javascript this way.

EDIT: The only other way of using C/C++ dll from javascript is swig interfaces. I have not used it, therefore I can only point you in that direction.

SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages. SWIG is used with different types of target languages including common scripting languages such as Javascript, Perl, PHP, Python, Tcl and Ruby.

Upvotes: 0

Related Questions