W
Hallo Leute, ich habe im Moment ein Problem mit einer COM Klasse. (SphinxIO)
Was habe ich gemacht:
Über den OleViewer habe ich mir alle Schnittstellen definitionen angeguckt:
// Generated .IDL file (by the OLE/COM Object Viewer)
//
// typelib filename: SphComIO.dll
[
uuid(A11CAE80-89AC-11D6-9A75-0050042E6E58),
version(5.3),
helpstring("SphComIO 5.0.0.3 Type Library"),
custom(DE77BA64-517C-11D1-A2DA-0000F8773CE9, 83951780),
custom(DE77BA63-517C-11D1-A2DA-0000F8773CE9, 1068625984)
]
library SPHCOMIOLib
{
// TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb");
// Forward declare all types defined in this typelib
interface Isphio;
interface ISphiom;
[
uuid(A11CAE8E-89AC-11D6-9A75-0050042E6E58),
helpstring("sphio Class")
]
coclass sphio {
[default] interface Isphio;
};
[
odl,
uuid(A11CAE8D-89AC-11D6-9A75-0050042E6E58),
helpstring("Isphio Interface"),
dual,
oleautomation
]
interface Isphio : IDispatch {
[id(0x60020000)]
HRESULT OnStartPage([in] IUnknown* piUnk);
[id(0x60020001)]
HRESULT OnEndPage();
[id(0x00000001), helpstring("method SphinxCreerEnquete")]
HRESULT SphinxCreerEnquete(
[in] BSTR enquete,
[out, retval] int* pVal);
[id(0x00000002), helpstring("method SphinxOuvrirEnquete")]
HRESULT SphinxOuvrirEnquete(
[in] BSTR enquete,
[out, retval] int* pVal);
[id(0x00000003), helpstring("method SphinxFermerEnquete")]
HRESULT SphinxFermerEnquete([out, retval] int* pVal);
.....
Daraus habe ich mir dann eine Header Datei gebastelt:
#include <initguid.h>
//A11CAE8D-89AC-11D6-9A75-0050042E6E58
DEFINE_GUID(IID_Isphio, 0xA11CAE8D, 0x89AC, 0x11D6, 0x9A, 0x75, 0x00, 0x50, 0x04, 0x2E, 0x6E, 0x58);
#undef INTERFACE
#define INTERFACE Isphio
DECLARE_INTERFACE_(Isphio, IDispatch)
{
STDMETHOD(QueryInterface) (THIS_ REFIID riid, PVOID* ppvObj)PURE;
//same as: virtual STDMETHOD(__stdcall QueryInterface(REFIID riid, void** ppvObj)=0;
STDMETHOD_(ULONG, AddRef) (THIS)PURE;
STDMETHOD_(ULONG, Release)(THIS)PURE; //same as: virtual ULONG __stdcall Release(void) = 0;
STDMETHOD(GetTypeInfoCount)(THIS_ UINT* pctinfo)PURE;
STDMETHOD(GetTypeInfo)(THIS_ UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo)PURE;
STDMETHOD(GetIDsOfNames)(THIS_ REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId)PURE;
STDMETHOD(Invoke)(THIS_ DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)PURE;
STDMETHOD(SphinxCreerEnquete) (BSTR enquete, int* pVal)PURE;
STDMETHOD(SphinxOuvrirEnquete) (BSTR enquete, int* pVal)PURE;
STDMETHOD(SphinxFermerEnquete) (int* pVal)PURE;
...
So und dann habe versucht das ganze zu benutzen:
if(FAILED(CoInitialize(NULL)))
{
AfxMessageBox("Failed to init COM");
return;
}
CLSID clsid;
CLSIDFromString(L"{A11CAE8E-89AC-11D6-9A75-0050042E6E58}", &clsid);
Isphio *isphio = NULL;
IClassFactory *factory = NULL;
if(FAILED(CoGetClassObject(clsid, CLSCTX_ALL, NULL, IID_IClassFactory, (void**)&factory)))
{
AfxMessageBox("Failed to get the class factory");
return;
}
if(FAILED(factory->CreateInstance(NULL, IID_Isphio, (void**)&isphio)))
{
AfxMessageBox("Failed to init Object through Factory Class");
return;
}
/*if(FAILED(CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_Isphio, (void**)&isphio)))
{
AfxMessageBox("Failed to create Instance of COM Object");
return;
}*/
if(!isphio)
{
AfxMessageBox("Kein Objekt!");
return;
}
int *retVal = NULL;
BSTR surveyName = SysAllocString(L"Gerda");
if(FAILED(isphio->SphinxCreerEnquete(surveyName, retVal)))
{
AfxMessageBox("Failed to call SphinxCreerEnquete(...)");
return;
}
else
{
CString str;
str.Format("Return Value: %n", retVal);
AfxMessageBox(str);
}
SysFreeString(surveyName);
isphio->Release();
CoUninitialize();
Allerdings stürzt das Programm beim Aufruf der Sphinx Methode ab...
Kann mir da jemand weiter helfen? Wäre wirklich wichtig!
Gruß