cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
tech_is
Level 5

calling a dll function

Hi,
I'm facing some problems in calling dll functions.
The problem is as:
I need to call some dll functions namely: Start, Get and Stop.
The call to these may look like(in C++):


byte bNos = 0xfff;
short handle = Start(0x03000001, bNos);

//Call to the Get() function as : handle = Get(parameters);

handle = Stop();


I tried calling 'em but got everytime got the error: Unhandled Exception
Error No:0x80040707
Dll function call crashed: MyDll.Start()
Setup will now Terminate.


Could some one plz help me with, how to call all of the functions with the datatypes, I think i'm getting stuck in 'em.

Thanks in advance. 🙂
Labels (1)
0 Kudos
(8) Replies
RobertDickau
Flexera Alumni

What do the InstallScript prototypes look like? What are the actual C++ function prototypes (as opposed to sample calls)?
0 Kudos
tech_is
Level 5

Hi Robert,
Thx for your response.
The function prototype is like:
prototype cdecl NUMBER MyDll.Start( NUMBER, NUMBER );

And the C++ function prototype looks like:
int Start(int,int &);

Ok. I got your point.
But how to pass the value by ref in installscript?
This didn't help:

NUMBER nNos;
prototype cdecl NUMBER MyDll.Start (NUMBER, BYREF NUMBER);
.
.
.
nNos = 0xfff;
handle = MyDll.Start(0x3000001, BYREF nNos);
Compilation Error:-
'BYREF' : missing expression.

If I change the call to:-
handle = MyDll.Start(0x3000001, nNos);
Error thrown:-
Function call resulted in bad stack.

How to call the function? Plz help.

Thanks in advance. 🙂
0 Kudos
RobertDickau
Flexera Alumni

To pass by reference, the BYREF keyword is needed only in the prototype and not the function call (as in your last example). With the bad-stack error, perhaps try leaving out the cdecl modifier?
0 Kudos
tech_is
Level 5

Hi Robert,

Thanks for the reply & help.

I declared the prototype with the BYREF keyword & the removal of cdel modifier also seems to work fine for the function Start. But how come the cdecl modifier was the culprit?

I'll check with the Get & Stop functions and if I face any problems, then shall post a reply very soon.



Thanks a lot. 🙂
0 Kudos
tech_is
Level 5

Hi Robert,
The removal of cdecl modifier stopped the error: function call resulted in bad stack. But the call to the function is not returning the desired output through the output parameter.
Could you please suggest a suitable prototype for the same function?

The C++ version of the function looks like:

int Start(parameter1, paramenter2);
The parameter1 is of the type DWORD and then parameter2 is of the type byte(parameter2 is ouput parameter).

In installscript I've declared the prototype as:

prototype NUMBER MyDll.Start( NUMBER, BYREF NUMBER ); //prototype declaration.
and in the function call also I've passed the parameters as:
NUMBER nParam1,nParam2;
MyDll.Start(nParam1,nParam2); //function call

Is the usage correct? I'm not getting the output as desired from the param2. It is always returning the value 0. :confused: And the problem is that i need to use the same value in calling another (Get()) function.
Could you provide a sample code? 😮



Thanks in advance. 🙂
0 Kudos
tech_is
Level 5

Hi,
One of the functions which I need to call from the installscript project is the Get function. The parameters of which are as follows:(in C++)

Get(param1,param2)->param1 & param2 are both output parameters.

They can be stated as:
TYPE: NAME: POINTER
DWORD Param1 PTR TO
WORD Param2 PTR TO

Please help me calling the function as i'm confused on how to call the function in installscript with the correct paramter types.:confused: Please provide a sample code.

Thanks in advance. 🙂
0 Kudos
RobertDickau
Flexera Alumni

In general, a function that returns a value and has two in-out parameters might look like this:

prototype int MyFunction(BYREF NUMBER, BYREF NUMBER);

And a sample use of the function (leaving out UseDLL and UnUseDLL) might be:
function OnBegin( )
NUMBER ret;
NUMBER arg1, arg2;
begin
// specify in-values, if necessary
arg1 = 220;
arg2 = 284;

// all the function: not necessary to compute pointers since
// prototype uses BYREF
ret = MyDLL.MyFunction(arg1, arg2);

// display what the DLL sent back
SprintfBox(INFORMATION, "MyFunction",
"After calling MyFunction:\n\n" +
"ret = %d\narg1 = %d\narg2 = %d", ret, arg1, arg2);
end;
0 Kudos
tech_is
Level 5

Hi Robert,
Thanks for the reply . I called the function the same way you explained in the example but before calling the Get function, the Start function needs to be called and this function is not returning the desired output.
The Start function is called in this way(installscript):

prototype INT MyDll.Start(NUMBER, BYREF NUMBER);
.
.
MyDll.Start(param1,param2);

The function call can be seen in C++ as:

byte param2;
short nReturn=Start(0x03000001,param2);//param2 is the output parameter.

The output parameter, param2 - is always returning the value 0 (installscript) where it should have returned 1 or 2, as desired:confused: . Please tell me if there are any changes required in the function call or is the byte type hindering the return value? please provide with an example as help.
You had also suggested to remove the cdecl modifier which removed the bad stack error, I was getting earlier. But why does this removal of the modifier, removes the error as well:confused: ?

Thanks in Advance. 🙂
0 Kudos