DISP_E_TYPEMISMATCH
-
Hi Leute,
ich hab folgendes Problem: Ich hab ein Hauptprogramm, welches mithilfe von PlugIns (ActiveX-Objekten) erweitert werden kann. Um auf die Methoden der einzelnen PlugIns zugreifen zu können, verwende ich IDispatch-Objekte. Dabei hole ich mir zuerst die Dispatch-ID der gewünschten Methode und rufe anschließend die Methode mit Invoke(...) auf. Das funktioniert alles einwandfrei mit einem bestehenden PlugIn, wenn ich jedoch ein weiteres PlugIn entwickeln will, funktioniert ein Methodenaufruf nicht und es wird der Fehler DISP_E_TYPEMISMATCH geworfen. Hier einmal der Code den ich verwendet hab (ich hab diesen einfach nur von dem schon existierenden PlugIn kopiert):
In der Datei "plugin.h":
class PLUGINCtrl : public COleControl, public baseOCXCtrl { // ... protected: // ... // Dispatch maps //{{AFX_DISPATCH(PLUGINCtrl) // ... afx_msg void setMyProperty(short id, const VARIANT FAR& theData); // ... //}}AFX_DISPATCH DECLARE_DISPATCH_MAP() // ... public: enum { //{{AFX_DISP_ID(PLUGINCtrl) // ... dispidSetImageRef = 24L, // ... //}}AFX_DISP_ID }; }In der Datei plugin.cpp:
// ... BEGIN_DISPATCH_MAP(PLUGINCtrl, COleControl) //{{AFX_DISPATCH_MAP(PLUGINCtrl) // ... DISP_FUNCTION(PLUGINCtrl, "setMyProperty", setMyProperty, VT_EMPTY, VTS_I2 VTS_VARIANT) // ... //}}AFX_DISPATCH_MAP END_DISPATCH_MAP() // ... void PLUGINCtrl::setMyProperty(short id, const VARIANT FAR& theData) { // ... }Dann noch die Datei plugin.odl
// ... methods: //{{AFX_ODL_METHOD(PLUGINCtrl) // ... [id(24)] void setMyProperty(short id, VARIANT theData); //}}AFX_ODL_METHOD // ...Der Aufruf erfolgt dann über die Hauptanwendung wie folgt:
// ... VARIANT var1, var2; COleVariant pvarArg[2]; VariantInit(&var1); VariantInit(&var2); var1.vt = VT_I2; var1.iVal = dlgRetcode; // the VARIANT with the SafeArray var2.vt = VT_ARRAY | VT_VARIANT; var2.parray = sa; // sa == SafeArray // assign the Variants to dispparamsArgs pvarArg[0] = var2; pvarArg[1] = var1; dispparamsArgs.rgvarg = pvarArg; dispparamsArgs.rgdispidNamedArgs = 0; dispparamsArgs.cArgs = 2; dispparamsArgs.cNamedArgs = 0; dispparamsArgs.rgvarg[1].vt = VT_I2; dispparamsArgs.rgvarg[0].vt = VT_ARRAY | VT_VARIANT; // Dieser Aufruf funktioniert, ich bekomme als dispid eine 24 zurück if (FAILED(hr = getDispatchID(myElement, "setMyProperty", &dispid))) AfxThrowOleException(hr); // invoke setMyProperty Method in the OCX unsigned int FAR* puArgErr; if (FAILED(hr = myElement->pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparamsArgs, NULL, NULL, puArgErr))) AfxThrowOleException(hr);Der Aufruf von Invoke verursacht hier einen Fehler (aber erst zur Laufzeit). In puArgErr steht eine 0 (d.h. das Argument 2 verursacht den Fehler DISP_E_TYPEMISMATCH. Vielleicht kennt ihr euch da etwas besser aus und könnt mir dabei helfen. Ich bin wirklich überfragt, was daran falsch sein soll, v.a. weil es in einem anderen PlugIn genauso funktioniert.