Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

We have an OLE server we've developed with Delphi (C++ builder actually). It has some methods with optional parameters. The ones with explicit defaults are fine, but the Type Library Editor does not allow a default for object (pointer) parameters (presumably because it knows they should be NULL). These parameters are causing problems with Win32::OLE in perl.

Here are the Win32::OLE->LastError()s for a method with an optional 2nd parameter:

$OleObj->Method($strFirstArg) gives: Win32::OLE(0.1709) error 0x80020005: "Type mismatch" in METHOD/PROPERTYGET "ExportIntegrationByCells" argument 1 $OleObj->Method($strFirstArg, undef) gives: Win32::OLE(0.1709) error 0x80020005: "Type mismatch" in METHOD/PROPERTYGET "ExportIntegrationByCells" argument 2 $OleObj->Method($strFirstArg, {Parameter2Name => undef}) gives: Win32::OLE(0.1709) error 0x80020005: "Type mismatch" in METHOD/PROPERTYGET "ExportIntegrationByCells" argument "Paramet +er2Name"

The hideous VB script manages if I put a Nothing as the 2nd argument, surely Perl should do better ;-?

Replies are listed 'Best First'.
Re: OLE optional parameter required
by jand (Friar) on Mar 02, 2010 at 08:28 UTC
    The error is thrown by the IDispatch implementation of your OLE server. Perl and Win32::OLE are just reporting the error.

    But anyways, the correct way to specify a "Nothing" pointer with Win32::OLE is:

    use Win32::OLE::Variant qw(nothing); # ... $OleObj->Method($strFirstArg, nothing);
    where nothing() really is just a convenience function for Win32::OLE::Variant->new(VT_DISPATCH)

      Holy dooley, holy mackerel, holy perl! It works. I grovel at your superior wisdom and offer prayers of thanks to the monks.

      My only question now is why the more or less saintly Jan Dubois does not say so in his erudite teachings on Win32::OLE at http://aspn.activestate.com/ASPN/CodeDoc/libwin32/OLE/Win32/OLE/TPJ.html instead of suggesting undef and named parameters? Does this mean there is something wrong with our server - that optional parameters are not working properly?

        Yes, the optional parameter doesn't seem to be optional. This may be due to the fact that it is hard (or maybe impossible) to specify even NULL as a default value for VT_DISPATCH parameters in IDL.

        It should still be possible to implement this at the server level if you write your own IDispatch implementation rather than relying on it being autogenerated based on the typelib. It is rather questionable if it would be worth it though.