C #: ссылка на интерфейс оболочки Windows - PullRequest
0 голосов
/ 18 декабря 2009

Я довольно новичок в C #, я пытаюсь завершить небольшой побочный проект, над которым я работаю, который использует небольшое количество кода C # для помощи в разработке гаджета для рабочего стола Windows. По сути, я пытаюсь реализовать интерфейс IDesktopGadget, чтобы я мог использовать метод RunGadget .

Вот что я получил от чтения информации о похожих интерфейсах:

[ComImport]
[Guid("C1646BC4-F298-4F91-A204-EB2DD1709D1A")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IDesktopGadget
{
    uint RunGadget([MarshalAs(UnmanagedType.LPWStr)] string gadgetPath);
}

К сожалению, я получаю сообщение об ошибке при попытке создать из него объект: "Cannot create an instance of the abstract class or interface 'GadgetTask.IDesktopGadget'"

Может ли кто-нибудь указать мне правильное направление и, возможно, помочь мне понять, что я делаю не так одновременно?

Ответы [ 2 ]

1 голос
/ 18 декабря 2009

Вам на самом деле нужна реализация объекта DesktopGadget, чтобы использовать интерфейс. MS предоставляет стандартный объект COM для этого в Windows 7. Вы можете создать экземпляр, выполнив что-то вроде:

Type t = Type.GetTypeFromCLSID(new Guid("924ccc1b-6562-4c85-8657-d177925222b6"));
IDesktopGadget dg = (IDesktopGadget)Activator.CreateInstance(t);
0 голосов
/ 28 июля 2011

Спасибо за руководство. Для немного более прямой помощи, вот что сработало для меня:

IDesktopGadget.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace GadgetActivator
{
    [ComImport]
    [Guid("C1646BC4-F298-4F91-A204-EB2DD1709D1A")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

    interface IDesktopGadget
    {
        uint RunGadget([MarshalAs(UnmanagedType.LPWStr)] string gadgetPath);
    }
}

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace GadgetActivator
{
    class Program
    {
        static void Main(string[] args)
        {
            Type t = Type.GetTypeFromCLSID(new Guid("924ccc1b-6562-4c85-8657-d177925222b6"));
            IDesktopGadget dg = (IDesktopGadget)Activator.CreateInstance(t);
            dg.RunGadget(@"C:\Program Files\Windows Sidebar\Gadgets\xxxxxxxxx.Gadget");
        }
   }
}
...