J,
Is this a custom interface or a dispatch interface? I assumed it was a
dispatch interface. Perl and many other languages like VB and javascript
work well with dispatch interfaces because dispatch interfaces were
specifically designed to accommodate languages like these.

All dispatch interfaces are various implementations of IDispatch, a set of
function prototypes defined my Microsoft. 

I think you have a custom interface because you are not using SAFEARRAYs. I
doubt Win32::OLE can accommodate custom interfaces. Can you implement your
object using a dispatch or dual interface? You might have to have the author
of your COM object wrap it in C++ with a dispatch interface so you can call
it from perl. Wraping it with a C++ dispatch interface is not hard with
Visual Studio's code generators. I would not want to do it without visual
studio, however.

Custom interfaces are a big problem. Not even microsoft's most recent
languages, VB.NET and C# can consistently call custom interfaces. I would
not want to try to do so directly in perl.

Siegfried

-----Original Message-----
From: J aperlh [mailto:[EMAIL PROTECTED] 
Sent: Thursday, June 02, 2005 7:59 PM
To: Siegfried Heintze
Cc: beginners@perl.org
Subject: Re: Argument passing between perl and a C function.

---------------------------------------------------------------------------
Thanks for you guys help.

There is an application written in C language by my colleague.
We are not allowed to share this application for security reason.

What I am going to do is to call a set of functions in this
application (OLE server) from a PERL script (OLE controller).

So far, all the functions are works well, except a reference(pointer)
related functions:
---------------------------------------------------------------------------
BOOL Calculate(BSTR* names, double* values, short number_of_names);
names: a list of names
values: a list of corresponding values,
number_of_names: size of the array

I don't know that I should pass to this funtion.
Array reference or something else?

I know that if the OLE controller is in C language, things will be easier,
Passing the first element of the array to this function is ok



On 6/3/05, Siegfried Heintze <[EMAIL PROTECTED]> wrote:
> J,
> You need more information about the function that is contained in the IDL
or
> the type library. Unfortunately, not all COM objects have an IDL file or
> type library.
> 
> Both the IDL file and the type library would tell us exactly what the "*"
> means in C because it is ambiguous. The "*" could mean we are passing a
> single value by reference, or multiple values.
> 
> I can tell you that it is not looking for a variant, however.
> 
> Often COM uses a special data structure called a SAFEARRAY to pass arrays
so
> it could be that your function is looking for scalars, not arrays.
> 
> Perhaps there is some documentation?
> 
> S
> 
> -----Original Message-----
> From: J aperlh [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, June 01, 2005 8:44 PM
> To: beginners@perl.org
> Subject: Argument passing between perl and a C function.
> 
> Argument passing between perl and C function.
> 
> 
> There is C function in a OLE server:
> What kind of variable should I pass to this function?
> #########################################################################
> BOOL Calculate(BSTR* names, double* values, short number_of_names);
> 
> 
> I tried the following script, but there is always an error like "Type
> mismatch" ...
> Is there any simple way to pass argument between perl and C function?
> #########################################################################
> #! perl -W
> 
> 
> use strict;
> use Win32::OLE;
> use Win32::OLE::Variant;
> 
> 
> my $names = Variant(VT_BSTR|VT_ARRAY, 3);
> my $values = Variant(VT_R8|VT_ARRAY, 3);
> 
> 
> $names->Put(['name1', 'name2', 'name3']);
> $values->Put([0, 0, 0]);
> 
> 
> my $ret = $app->Calculate($names, $values, 3);
> 
> --
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> <http://learn.perl.org/> <http://learn.perl.org/first-response>
> 
> 
>

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to