Programmieren - alles kontrollieren 4.932 Themen, 20.605 Beiträge

Was bedeutet dieser kurze Delphi-Code? Evtl. umwandeln in C

Mdl / 0 Antworten / Baumansicht Nickles

Habe einen kurzen Delphi-Code gefunden, der auch gut funktioniert. Sollte ja wohl nicht schwer sein, den in C/C++ umzusetzen... Ja, Pustekuchen...

Nach der Variablendefinition:

  IObject: IUnknown;
  SLink: IShellLink;

ist das der Code:

  IObject:=CreateComObject(CLSID_ShellLink);
  SLink:=IObject as IShellLink;

Das Problem ist die letzte Zeile:

Ich habe also ein IUnknown-Objekt, das durch eine 'as' Funktion irgendwie in ein IShellLink-Objekt umgewandelt wird. Zuerst dachte ich, das sei durch eine einfache Zeiger-Cast-Funktion in C zu machen. Nachdem ich aber beim Verwenden von SLink dann eine Exception bekommen und ich mit dem Debugger nachgesehen habe, hat sich herausgestellt, dass die Objekt IObject und SLink unterschiedliche Adressen haben(*). (In Delphi werden die Objekte intern wohl als Adressen auf Objekte implementiert, während man in C direkt mit den Adressen hantiert.)

(*z.B. IObject=0x33c680/SLink=0x33c658 oder 0x50c680/0x50c658, ... Interessant ist, dass die letzten beiden Ziffern bei all meinen Versuchen (insges. >5) immer dieselben sind)

Delphi muss also von irgendwoher die Information haben, welches Offset der IShellLink-Typ benötigt, um ein IObject als SLink zu interpretieren.

Wie macht das also Delphi?

Eine Erklärung hilft mir genauso, wie die Konvertierung der letzten Zeile in C/C++.

Viele Grüße,

Mdl

P.S. Vielleicht doch noch die ersten Zeilen meines C-Codes:

  IUnknown *IObject;
  IShellLink *SLink;

  IObject=CreateComObject(CLSID_ShellLink);
  SLink= ???

bei Antwort benachrichtigen