Problem mit idl-Schnittstelle und ProxyStub-Übergang
-
Hallo,
ich habe eine Schnittstelle mit folgender Methode:
[id(11)] HRESULT set_ListConfig ( ... [in,out] unsigned long *ulCntColumns, // number of columns to display [in,out,size_is(,*ulCntColumns)] AucColumnInfoStructT **aColumnInfo, // information about every column ... );AucColumnInfoStructT is:
typedef struct tag_AucColumnInfoStructT /* FORMAT IDL */ { ... unsigned long ulSelData; /* count of types */ [size_is(ulSelData)] TypDefResultT* pSelData; /* Subarray with type data */ ... } AucColumnInfoStructT;Solange ich diese Methode mit speziell den beiden dargestellten Parametern nur als reine IN-Parameter verwendet habe hat alles funktioniert.
Seit ich sie auf IN,OUT umgestellt habe stürzt das Programm im Client/Server-Betrieb beim Rücksprung zum Client ab.Wenn ich testweise *ulCntColumns auf 0 und *aColumnInfo explizit auf NULL setze, läuft es wieder.
Ich vermute das es was mit der IDL-Notation
[size_is(ulSelData)] TypDefResultT* pSelData;zu tun hat. Oder stößt der MIDL hier an seine Grenzen ?
Danke im Voraus
Taras
-
Was übergibst Du on der Client Seite? Beim Aufruf.
Was übergibst Du auf der Serverseite?
Was sagt der Callstack?
Was passiert gerade (Allokation/Freigabe von Speicher)?
-
Der Client-Aufruf ist wie folgt:
CAucMemHdl<AucColumnInfoStructT> m_ColumnInfo; _Ty** InOut() throw() {_sizeHandled=false;return &_Ptr; } hr = m_pAucFKListe->set_ListConfig( ... &m_ulcntColumns, m_ColumnInfo.InOut(), ...);wobei CAucMemHdl ein Wrapper ist, der Speicher allokiert bzw freigibt und diverse andere Möglichkeiten bietet.
Hier wird über InOut der Pointer weitergereicht.Die Serverseite ändert im einfachsten Fehlerfall an den Daten gar nichts und springt mit einem return wieder aus der Server-Methode raus. Direkt danach sieht der Stack im Client beim Absturz wie folgt aus:
NTDLL! 7c911230()
NTDLL! 7c97cd80()
NTDLL! 7c97e69b()
NTDLL! 7c95976b()
OLE32! 774cd420()
OLEAUT32! 770f4a74()
OLEAUT32! 770f4abb()
OLEAUT32! 770fc54e()
RPCRT4! 77e6c106()
RPCRT4! 77e66297()
RPCRT4! 77e68f30()
RPCRT4! 77e5b3f5()
RPCRT4! 77e6bf91()
RPCRT4! 77e6bcb2()
RPCRT4! 77e5b547()
RPCRT4! 77e5b188()
RPCRT4! 77e5b547()
AUC0CLIENTSERVERATCLIENTPS! 03cd132c()
HandleHook() line 518
CAucListWindow::SaveListConfigAs() line 4251 + 10 bytesAUC0CLIENTSERVERATCLIENTPS ist die ProxyStub-Dll.