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= ???