Verwenden des ITaskList Interfaces in C#

Hallo,
ich würde gern das ITasklist Interface von C# aus verwenden. Die COM-Initialisierung eines ITasklist Objektes scheint fehlerfrei zu funktionieren, ich scheitere aber wohl an der korrekten Deklaration des Interfaces. Mein bisheriger Code:

// Deklaration der Tasklist Klasse
// laut MSDN wird bei verwenden des ComImport Attributs CoCreateInstance nicht benötigt
[ComImport]
[Guid(„56FDF344-FD6D-11d0-958A-006097C9A090“)]
public class Tasklist //: ITasklist
{
}

// Deklaration des Interfaces
// [ComImport, Guid(„56FDF344-FD6D-11d0-958A-006097C9A090“)]
public interface ITasklist {

//[DispId(1)]
[return: MarshalAs(UnmanagedType.FunctionPtr)]
IntPtr HrInit();

//[DispId(2)]
IntPtr AddTab([In] IntPtr hwnd);

//[DispId(3)]
IntPtr DeleteTab([In] IntPtr hwnd);

//[DispId(4)]
IntPtr ActivateTab([In] IntPtr hwnd);

//[DispId(5)]
IntPtr SetActivateAlt([In] IntPtr hwnd);

}

// diese werden dann in einer beliebigen Funktion instanziiert:
void eineFunktion() {
Tasklist list = new Tasklist(); // bis hier hin ist es noch ok, das Tasklist Object kann (scheinbar) einwandfrei erstellt werden

ITasklist ITasklist = (ITasklist)list; // hier bekomme ich dann eine InvalidCast Exception, vermute also, dass ich das Interface falsch deklariert habe

Wer weiß rat? Wie kann man generell ein COM Interface in C# nachbilden?
Vielen Dank für eure Mühen
Christian Dankl

Hi!

Ohne genauer hingeschaut zu haben: Ist das Absicht, dass ComImportAttribute beim Interface auskommentiert ist?
Abgesehen davon musst Du Dir in 99% der Fälle die Mühe gar nicht machen, sondern kannst einfach in VS einen Verweis auf eine COM TypeLibrary auswählen, damit die nötigen RCW automatisch generiert werden.
Somit müsstest Du nur noch finden, in welcher DLL die ITaskList implementiert ist und gut…

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi!

Ohne genauer hingeschaut zu haben: Ist das Absicht, dass
ComImportAttribute beim Interface auskommentiert ist?
Abgesehen davon musst Du Dir in 99% der Fälle die Mühe gar
nicht machen, sondern kannst einfach in VS einen Verweis auf
eine COM TypeLibrary auswählen, damit die nötigen RCW
automatisch generiert werden.
Somit müsstest Du nur noch finden, in welcher DLL die
ITaskList implementiert ist und gut…

Gruß,
Martin

Hallo,
erstmal muss ich mich entschuldigen, das betreffende Interface nennt sich ITaskbarList, nicht ITasklist.
Sämtliche auskommentierten Zeilen hatte ich bereits verwendet, also ich jedoch sah, dass sie nicht funktionieren habe ich sie sukzessive auskommentiert.
Auch wenn ich nicht weiß, was RCW bedeutet, aber die Idee mit dem Verweis klingt gut und einfach. Implementiert ist das Interface in der shell32.dll (ab Win98, der betreffende Header wäre shobjidl.h). Leider finde ich zu dieser DLL bei den Verweisen unter COM keine TypeLibrary.
Mein nächster Versuch, einen direkten Verweis auf die shell32.dll zu erstellen brachte allerdings auch keinen Erfolg, da ITaskbarList vom Obejektbrowser nicht aufführt wird.
Kann mir jedoch nicht vorstellen, dass es gerade zur shell32.dll keine TypeLibrary geben soll. Bestimmt kannst du mir doch einen Tipp geben, wo ich die betreffende TypeLibrary finde?
Christian Dankl

Hallo nochmal!
RCW = „Runtime Callable Wrapper“, ein Wrapper für COM-Objekte, über den sie wie „normale“ .NET Klassen ansprechbar sind. Erstellbar bspw. über tlbimp.exe (Bestandteil des SDKs).
Hmm, wenn die ITaskbarList nicht im Objektbrowser auffindbar ist, wird sich das Erstellen des Wrappers vermutlich auch schwierig gestalten. Leider habe ich für so einen Fall keine Lösungen in der Tasche, selbst googeln ist also angesagt…
Evtl. findest Du auf pinvoke.net noch etwas dazu…

Gruß + viel Glück bei der Suche,

Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]