H
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.