Hallo allemaal,
De situatie is dat ik met mijn Delphi programma een activeX applicatie geschreven in VB moet kunnen aanspreken. Van het betreffende programma is geen source code beschikbaar, maar eerdere client programma's in VB werken prima.
Ik loop tegen de volgende problemen:
In Delphi 5 stopt het importeren van de type library met de melding "Ghostmethod_240 already exists". Einde Oefening.
In Delphi 4 lukt het importeren wel en ik kan nu redelijk met de activex app werken.
Het valt wel op dat ik alleen maar wegkom met de dispinterface - maar dat vind ik niet erg.
Behalve WideStrings en SmallInt zijn er ook functies die een array by reference
verwachten, deze herdimensioneren en vullen met strings.
Een voorbeeld is als volgt in de .TLB gedefinieerd:
function GetCalibrations(var Description: {??PSafeArray} OleVariant;
var NbrCalibrations: Smallint): OleVariant; dispid 1610809402;
in mijn programma:
procedure listCalibrations;
var
N: SmallInt;
CalList: OleVariant;
Resl: OleVariant;
begin
CalList:= varArrayCreate([0,0], varOleStr);
Resl:= AppDI.GetCalibrations(CalList, N);
// etc..
end;
Hiermee probeer ik dus de array van strings Description uit te lezen en het aantal.
Het probleem is dat ik nu een runtime "type mismatch" exception krijg.
Ik heb geprobeerd 'OleVariant' in 'PSafeArray' te veranderen (waarom genereerd Delphi 4 dit wazige commentaar {??PSafeArray} eigenlijk ? het heeft er vast iets mee te maken) - maar dit geeft een compiler "type not allowed in OLE automation section". Tenslotte, vervanging van 'var' door 'const' schiet het doel voorbij hoewel ik dan geen exceptions meer krijg (en NbrCalibrations klopt ook).
Dit probleem gebeurd dus alleen bij het 'by reference' passen van een OleVariant vanuit Delphi naar een VB applicatie.
Heeft iemand hierover meer te zeggen?
Groeten,
sdk.
Bookmarks