ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4396119
Jetzt (Chat):
20 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

FAQ - Frequently Asked Questions - Allgemeine Programmierung


COM Objekte selbst entwerfen!

Grundlagen ersetzten kein vollständiges Tutorial:
Zitat:
Zufällig mein Fachgebiet :)

Ich nehme an du meinst mit VisualC++. Der Assistent zum erzeugen einer COM-Komponente heisst hier "ATL-COM-Anwendungs-Assistent". Der legt dir eine einfache COM-DLL mit DllRegisterServer(), DllUnregisterServer() etc. an.
(Bei COM geht es ja nicht um DLLs oder EXEs. Wenn du die Erzeugung eines Objektes anforderst, wird die notwendige DLL in der Registry ermittelt und geladen.)

Wenn du mal auf eine Symbolleiste in der IDE rechtsklickst siehst du einen Eintrag für eine Symbolleiste mit Namen "ATL", aktiviere die. Sie besitzt genau eine Option: "Neues ATL-Objekt". Damit legst du quasi ein COM-Objekt und ein Interface für das Objekt an.


Die Interfaces sind in einer Datei mit der Endung .idl (Interface Description Language) gespeichert. Mach dich mit dieser Sprache vertraut (ist eigentlich nur 'ne C++-Header-Datei mit ein paar Zusatzschlüsselwörtern). Wenn du neue Methoden über COM veröffntlichen willst, musst du sie an drei Punkten einfügen. Ich erklär's mal mit einer Beispielmethode "PrintString".

In der .idl würdest du dafür in dein Interface schreiben:
Code:
[ id(1), helpstring(\"Prints a string somewhere\") ]
  HRESULT PrintString([ in ] BSTR sStringToPrint);


In deiner Header-Datei dann:
Code:
STDMETHOD(PrintString)(/*[ in ]*/ BSTR sStringToPrint);


Und schliesslich in der Quelldatei:
Code:
STDMETHODIMP CMyClass::PrintString(BSTR sStringToPrint) {
  // Beispiel
  OutputDebugString(_bstr_t(sStringToPrint));

  return S_OK;
}


Mach dich am besten auch mit Microsoft's Hilfsklassen vertraut, und zwar nicht CComBSTR und CComPtr (veraltet), sondern die aus ComDef.h (using namespace _com_util nötig):
Code:
#include 
using namepsace _com_util;

void moo() {
  // Smartpointer definieren
  COM_SMARTPTR_TYPEDEF(IMyInterface, IID_IMyInterface);

  try {
    IMyInterfacePtr spSmartPointer;

    // Externe Klasse erstellen
    spSmartPointer.CreateInstance(CLSID_CMyClass);
    // Interne Klasse erstellen
    spSmartPointer = new CComObject();

    // HRESULT in Exception umwandeln
    CheckError(spSmartPointer->PrintString(_bstr_t(\"Hello, World\")));
  }
  catch(const _com_error &e) {
    // e.ErrorMessage() enthält den Fehlerstring
    // e.Error() den Fehlercode
    return e.Error();
  }
  
  return S_OK;
}

_bstr_t ist eine Hilfsklasse ähnlich std::string(), die automatisch zwischen BSTR und const char * oder const wchar_t * konvertiert.


Ich glaube, das alles zu erklären wäre noch nicht mal innerhalb eines Tutorials möglich, geschweige denn die Erfahrung zum guter Architektur mit COM, aber das sollte dir hoffentlich erstmal einen Start geben ;)

-Markus-

von Cygon