?
Solved

Calling a dll from javascript

Posted on 2003-03-27
21
Medium Priority
?
699 Views
Last Modified: 2007-12-19
Hello all, what I am trying to do here is to call a dll from javascript.  The javascript will send 2 parameters (both strings) to a function in the dll.  The dll will return a string array to the javascript where the javascript will then output the results.

The dll was created using MSVC++ 6.0.  The project type of this dll is Win32 Dynamic-Link Lirary.  It is NOT an ATL COM AppWizard.

Can someone tell me the steps I need to take in order to be able to do this?  Do I need to register the dll, set the PATH environment variable, etc.  Any help would be great since I am having troubles finding example on the web.

- Leobaz2
0
Comment
Question by:leobaz2
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 11
  • 5
  • 5
21 Comments
 
LVL 46

Expert Comment

by:fritz_the_blank
ID: 8221393
Are you talking about server-side JScript?

Fritz the Blank
0
 

Author Comment

by:leobaz2
ID: 8225114
No, this is all on the client side.  What I want is for the client to take a file and extract data from it.  Such data would be the last saved time, author, title, number of words, number of lines, etc.  This extraction is all done in dlls.  

The client would use javascript to call a dll.  The javascript would send to the dll the absolute path to the filename.  The dll would extract metadata about the file specified by the path.  This data will be return to the javascript by a string array.
0
 
LVL 46

Expert Comment

by:fritz_the_blank
ID: 8225143
So, are you saying then that the .dll would be on the client machine?

If not, then there is no way the client-side script can call a .dll on your server. On the other hand, how do you know that the .dll exists on the client machine? Even if it did, the security model would not allow that kind of behaviour without the use of ActiveX, which most people have disabled because of security concerns.

Fritz the Blank
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:leobaz2
ID: 8225342
The dlls would be on the client machine.  The client would recieve these dll files from the installation.

But say that ActiveX is enabled.  Would I have to make a dll using the ATL COM AppWizard in MSVC++, or can I just use a win32 dynamic link library?
0
 

Author Comment

by:leobaz2
ID: 8225346
The dlls would be on the client machine.  The client would recieve these dll files from the installation.

But say that ActiveX is enabled.  Would I have to make a dll using the ATL COM AppWizard in MSVC++, or can I just use a win32 dynamic link library?
0
 
LVL 46

Expert Comment

by:fritz_the_blank
ID: 8225406
I am not sure about that. I have never used this model as none of my clients have ever allowed it.

Fritz the Blank
0
 

Author Comment

by:leobaz2
ID: 8225519
Is there another way I can do this then?  My original though was to create a broswer plugin.  I read somewhere on the web that the easiest way to make a browser plugin for IE would be to use activeX.  Is there another way I can create a browser plugin with IE?
0
 
LVL 1

Expert Comment

by:gmsolutions
ID: 8228784
You need to create a new com dll component. add the
rutines you wish to call the other dll to this component and the create wrapper functions in the com component.

Compile the dll and sign it. When you install the com wrapper by copying it to hdd and registering it. you will be able to create an instance of it in explorer or any other com compatible application.  Simply call the wrapper rutines from your javascript. (use the clsid of the wrapper)

"If you signe and install a dll component on a client machine you should not be queryed to its safty"
I created a zlib com wrapper for exactly the same reasons and have used it succsessfully to compress and deompress data even from a web page withought trigering ms security warnings.

You only need to crerate an activex dll wich in vb terms i belive translated to com atl in c/c++
0
 
LVL 1

Expert Comment

by:gmsolutions
ID: 8228793
oh did i forget to mention the rundll.exe on windows wich will alow you to call procedures. use wsh etc to get at the command line

Doing so will still not do exactly what you want unless you wrap it in com as their is not other way to call dlls from web browsers without some extension.
0
 

Author Comment

by:leobaz2
ID: 8239032
OK, thanks for the advice gmsolutions, but I am now getting another error.  I have posted this error in another question.  Can you please help me on that one too?

http://www.experts-exchange.com/Web/Web_Languages/JavaScript/Q_20566857.html

In summary, this question is about an error I am getting in my javascript.  When I try to create the activeX object, I get an "automation server can't create object" error on this line:

x=new ActiveXObject("WebPlugin.dll");
0
 
LVL 46

Expert Comment

by:fritz_the_blank
ID: 8239089
It sounds like it may be a permissions error...

Fritz the Blank
0
 

Author Comment

by:leobaz2
ID: 8239396
I have changed all of the permissions for all of my zones to the lowest possible.  It still doesn't work.  Any other ideas?
0
 

Author Comment

by:leobaz2
ID: 8240704
I found my problem.  I was using WebPlugin.dll which isn't the progID.  The progID was WebPlugin.Plugins.  Thanks anyway.

I will not award any points however since no one figured out the problem.  Im sorry.  However, I have yet another problem.

Using the activeXobject I am creating using javascript, I am calling a function in the dll.  This function is just a test function, its only purpose is to add two number which are passed in.

I am passing a results variable along with the 2 number to add in the parameters.  The c++ will get a pointer to that variable and then store the result in the parameter pointer.  When I print out this result in the javascript, it says undefined.  Is there something I am doing wrong?  Is there a certain way to return values from COM to Javascript?

Here is the C++ code:

// Plugins.cpp : Implementation of CPlugins
#include "stdafx.h"
#include "WebPlugin.h"
#include "Plugins.h"

/////////////////////////////////////////////////////////////////////////////
// CPlugins


STDMETHODIMP CPlugins::AddNumbers(long Num1, long Num2, long* ReturnVal)
{
     // TODO: Add your implementation code here
     *ReturnVal = Num1 + Num2;

     return S_OK;
}


Here is the javascript code:

var x = new ActiveXObject("WebPlugin.Plugins");
var result;
x.AddNumbers(4,8,result);
pluginForm.metadata.value = "result = " + result + "\n";

The output in the pluginForm.metadata textbox is:
result = undefined

NOTE:
When declaring result, if I do var result = 5 instead of just var result, I get the value of result when I output it as 5.  So it looks like there is nothing happening to result when I pass to the function.

Any help would be great.
Thanks.
0
 
LVL 46

Expert Comment

by:fritz_the_blank
ID: 8242288
Unsubscribing....

Fritz the Blank
0
 
LVL 1

Expert Comment

by:gmsolutions
ID: 8243091
Ahh good yes you call your objects by "component.class" or "{cls-id-xxx-xxx}" figuring things out like that on your own ensures you dont continue make the same mistake.

As to your other question. My experiance in windows c++ programming is very limited so i cannot answer your question here. The only way i could help here is to write a simple wrapper for all your functions in visual basic 6 and post you back the source code and possibly a binnary.

In my opinion you arent geting/seting the referance to result.

give it a value and then call AddNumbers to see if it still returns undef.

i am curiose if *ReturnVal = Num1 + Num2; actually changes the pointer and not the values.


if your intrested i can code up a wrapper for u in vb6 but sorry i cant help you further in c++



 










0
 

Author Comment

by:leobaz2
ID: 8246158
Im sorry but I have to do this in C++.  Can you provide me with a little VB that will do the same thing?  Thank would be helpful.  Also can you write the javascript also if it is different from mine?  Thanks
0
 

Author Comment

by:leobaz2
ID: 8247975
I figured out the problem.  In my IDL file, I declared the last parameter, which is my return value, to be [out] when it should have been [out, retval].

Thanks for everyones help.
0
 
LVL 1

Expert Comment

by:gmsolutions
ID: 8251260
hehe by the time i read both your last posts i had allready written a vb com wrapper. all you have to do is add the declares and wrapp them in the class.

it functions as a service and creating any instance of a plugin class from the web page will also create a referance to it in a collection held in plugins.

This class can be created by an application or webpage and will allow them to call the wrapper functions independantly as well as comununicate with each other including between multiple web pages in seperate windows.
It does this by including a third class wich sinks its events in the plugins class. This allows the plugin class to manage a collection of plugin classes.

Only one function to enumerate plugin classes created and to one calculate 1 addition is provided.
Also an example wrapper for getticks api and sleep.
id presume you know how to pass variables etc to dll's thru vb

if you are intrested ill post it to u.
0
 

Author Comment

by:leobaz2
ID: 8253735
Thanks for taking the time and writing the VB code.  Because I'm such a nice guy, I will give you the points just for helping me out.  I just have one more question.

My method in the COM dll has to return an array or strings.  It doesnt have to be strings, it could be char*, BSTR, whatever it takes to send an array of text back to the javascript.  I am trying to mess around with SAFEARRAY in the COM and creating an array in JavaScript using VBArray(array), but this isn't working.  I think my problem is in the COM.  For some reason, the array isn't being returned.  I got the code for creating the SAFEARRAY from another question.  Here is my COM code:

STDMETHODIMP CPlugins::ReturnArray(VARIANT *Array)
{
     // TODO: Add your implementation code here    
     VariantInit (Array);
     Array->vt = VT_ARRAY | VT_I4; // Array of integers

     SAFEARRAY* psa;
     // 10 elements numbered 0-9
     SAFEARRAYBOUND bound = { 10, 0 };
     psa = SafeArrayCreate (VT_I4, 1, &bound);

     if (psa == NULL)
         return E_OUTOFMEMORY;

     for (long i=0; i<10; i++)
         SafeArrayPutElement (psa, &i, &i);

     Array->parray = psa;

     return S_OK;
}

Do you see anything wrong?  Thanks
0
 
LVL 1

Accepted Solution

by:
gmsolutions earned 200 total points
ID: 8258578
please note that this is for leobaz2 only please dont overload my home account.

As promised and of course not production quality.
http://dcn.ath.cx/downloads/WebPlugin.zip

Add ur declares remove some of my junk and add error checking and you can wrap your dll completly.
Please note that you will still need to sign it to ensure it does not ask about scripting activex.


As for your more recent question. "c++ uses pointer to an array of data but javascript uses and array of pointers to data"
 
I realy hope these links are what you are looking for. :)

http://www.yasd.com/devaspcomp2/bonus/arrays.htm
http://www.codeguru.com/atl/passing.html
http://www.codeproject.com/atl/safearray_macro.asp
http://www.faqchest.com/msdn/JCOM/jcom-00/jcom-0007/jcom00070806_13716.html





0
 

Author Comment

by:leobaz2
ID: 8265010
Thanks gmsolutions.
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

International Data Corporation (IDC) prognosticates that before the current the year gets over disbursing on IT framework products to be sent in cloud environs will be $37.1B.
In this blog, we’ll look at how improvements to Percona XtraDB Cluster improved IST performance.
The viewer will learn the basics of jQuery, including how to invoke it on a web page. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery.: (CODE)
The viewer will learn the basics of jQuery including how to code hide show and toggles. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery…

719 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question