COM (ComponentObjectModel) / Methodenzugriff



  • Hi, ich habe da ein "kleines" Problem.
    Ich muss über eine COM-Schnittstelle auf ein Programm zugreifen. Die Verbindung zu dem Programm funktioniert anscheinend auch (zumindest startet das andere Programm). Aber wenn ich dann die Funktionen des Programmes zugreifen will, schmiert mein Programm mit einer Speicherverletzung ab.

    Vorgegangen bin ich folgendermaßen:

    1. Kleine Dialog-Anwendung erstellt

    2. Über den Klassen-Assi unter dem Register Automatisierung gewählt. Dort habe ich die entsprechende exe ausgewählt und alle Klassen importiert.

    3. Button und dazu eine Funktion eingefügt.

    //COM Library laden
    	if(FAILED(CoInitialize(NULL)))
    	{
    		MessageBox("OLE Initialisierung gescheitert");
    	}
    	else
    	{
    		MessageBox("OLE Initialisierung OK");
    	}
    
    	BSTR strClsID, strIID;
    	//SysAllocString --> legt Speicher für den neuen BSTR an und kopiert den Inhalt von sz in den neuen String
    	strClsID = SysAllocString(L"{3F3AA3C3-54E6-4EAD-AEA1-DB3F2C88857D}");
    	strIID = SysAllocString(L"{E8FFA128-F4D9-4E93-9618-A0AA50EBD62A}");
    
    	CLSID clsid, clsiid;
    	CLSIDFromString(strClsID, &clsid);
    	CLSIDFromString(strIID, &clsiid);
    
    	IPassoloApp *PasObject;
    	HRESULT RetVal = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, clsiid, (void**) &PasObject);
    
    	if(SUCCEEDED(RetVal))
    	{
    		MessageBox("COM-Objekt-Erzeugung OK");
    	}
    	else
    	{
    		MessageBox("COM-Objekt-Erzeugung gescheitert");
    	}
    

    Wenn ich jetzt eine Funktion der Klasse aufrufe krachts:

    PasObject->SetVisible(true);
    bzw.
    PasObject->Output("Hallo");
    

    Weiß da jemand rat und könnte mir sagen, was mir noch fehlt?

    MFG Stefan

    Edit: Ich glaube, es liegt an dem Interface. Da stimmt wahrscheinlich irgendwas nicht. Hab eben mal ein anderes Interface angegeben (IID_IUnknown) und damit ist das Programm genausso gestartet. Der Rückgabewert (RetVal) ist allerdings 0, was ja auf eine korrekte Verarbeitung hinweist!



  • Gleich nochmal eine Frage hinterher. Sollte ich mit meinem Objekt nicht eine Release() Funktion aufrufen können, die von IUnknown geerbt ist?

    MFG Stefan


Log in to reply