C++,COM,VB: Methode mit Objekt-Parameter

Hallo Experten,

ich entwickele gerade COM-Objekte mittels der ATL, also in C++, die in Visual Basic (VB) genutzt werden sollen, und da stellen sich mir folgende Probleme:

Es sollen 2 COM-Objete implementiert werden, Customer und CustomerList, und zwar mit folg. Methoden/Properties bzw. Interfaces. Dazu ein VB-Code-Fragment:

 Dim k As Customer
 Set k = New Customer

 Dim liste As CustomerList
 Set liste = New CustomerList

 k.CustomNo = 3
 k.Name = "Rolf"
 k.Address = "Bielefeld"

 ' kunde in die liste einfuegen
 liste.addCustomer(k)

Wie man sieht hat das Objekt Customer die Properties ‚CustomNo, Name, Address‘ und CustomList die Methode ‚addCustomer(Customer)‘. Die Implementierung dieser Methode bereitet die Schwierigkeiten. In dem Objekt-Katalog stellt sich die Methode richtig dar als:

Sub CustumerList.addCustomer(newCustomer As Customer)

Leider erhalte ich beim Ausfuehren des VB-Programms eine Fehlermeldung:

‚Objekt unterstuetzt Methode nicht‘

welche sich auf den Aufruf von addCustomer bezieht. Anscheinend erkennt VB die Methode also nicht (obwohl sie sich im Katalog richtig darstellt). Wie muss ich also die Interface-Methode in C++ deklarieren, damit VB diese erkennt. Das zugehoerige (duale!) Interface in C++ heisst ICustomerList. Meine Implementierung hat folg. Deklarationen:

In der IDL:
[id(2), helpstring(„Methode addCustomer“)]
HRESULT addCustomer([in] ICustomer* newCustomer);

und die zugehoerige C+±COM-Klasse definiert dann

COM/C++:
STDMETHOD(addCustomer)(/*[in]*/ ICustomer* newCustomer);

Ich hoffe jemand kann mir helfen, bin schon voelligst verzweifelt. Vielen Dank im vorraus

Gruss Rolf

Hi Rolf,

ich habe zu VB praktisch alles wieder vergessen, aber
gehört vor das newCustomer nicht ein byRef?

>>Sub CustumerList.addCustomer(newCustomer As Customer)

>>In der IDL:
>>[id(2), helpstring(„Methode addCustomer“)]
>>HRESULT addCustomer([in] ICustomer* newCustomer);
^^^

Gruß Patrick

ich habe zu VB praktisch alles wieder vergessen, aber
gehört vor das newCustomer nicht ein byRef?

Hi Patrick,

da ich von VB so gut wie gar nichts weiss (ich entwiclkele ja in C++), weiss ich auch nicht wo das byRef hin muss. In die IDL? Waere nett wenn Du mir den entsprechenden Code mitliefern wuerdest. Die Anzeige in dem Objekt-Katalog (Sub …) kann ich natuerlich nicht veraendern, den generiert VB aus der TypeLib, diese wird widerum aus der IDL generiert.

>>Sub CustumerList.addCustomer(newCustomer As Customer)

>>In der IDL:
>>[id(2), helpstring(„Methode addCustomer“)]
>>HRESULT addCustomer([in] ICustomer* newCustomer);

Hallo Rolf

>>Waere nett wenn Du mir den entsprechenden Code mitliefern
>>wuerdest
kann ich nicht da ich keinen habe, aber Du hast ja folgendes
deklariert:

ICustomer* newCustomer

Bei VB kann man die Parameter entweder byVal oder byRef übergeben, also als Wert oder Referenz. Ich vermute, daß
in Deinem VB Programm das dann so heißen muß:

Sub CustumerList.addCustomer(byRef newCustomer As Customer)

bin aber nicht sicher!

Gruß Patrick

Hallo Patrick

>>Waere nett wenn Du mir den entsprechenden Code
mitliefern
>>wuerdest
kann ich nicht da ich keinen habe, aber Du hast ja folgendes
deklariert:

Ich meinte mit ‚Code‘ die entsprechenden Deklarationen in der IDL oder im C+±COM-Interface. Wie schon gesagt kann ich die VB-Deklarationen direkt (also in VB) nicht aendern, da sie sich aus der Beschreibung in der IDL ergeben.

Das Problem hat sich aber mittlerweile ‚geloest‘. Der Aufruf der Methode muss in VB wie folgt aussehen:

liste.addCustomer k

und nicht so

liste.addCustomer(k)

D.h. man muss die Parameter-Klammern weglassen, und ich vermute dass das genau den Effekt hat den Du angesprochen hast, ohne Klammerung wird wahrscheinlich ein call-by-reference und mit Klammern ein call-by-value durchgefuehrt, und der call-by-value wird anscheinend nicht unterstuetzt, aber warum nicht? So ganz klar ist mir das alles nicht, aber ich weiss jetzt wie es geht.

Danke nochmal

Gruss Rolf