C#:引用windows shell界面

C#:引用windows shell界面,c#,winapi,windows-desktop-gadgets,C#,Winapi,Windows Desktop Gadgets,我对C#相当陌生,我正在尝试完成一个我一直在做的小项目,它使用少量C#代码来帮助开发Windows桌面小工具。基本上,我正在尝试实现IDesktopGadget接口,以便使用该方法 以下是我从阅读类似接口的信息中得到的信息: [ComImport] [Guid("C1646BC4-F298-4F91-A204-EB2DD1709D1A")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IDesktopGadget

我对C#相当陌生,我正在尝试完成一个我一直在做的小项目,它使用少量C#代码来帮助开发Windows桌面小工具。基本上,我正在尝试实现
IDesktopGadget
接口,以便使用该方法

以下是我从阅读类似接口的信息中得到的信息:

[ComImport]
[Guid("C1646BC4-F298-4F91-A204-EB2DD1709D1A")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IDesktopGadget
{
    uint RunGadget([MarshalAs(UnmanagedType.LPWStr)] string gadgetPath);
}
不幸的是,我在尝试从中创建对象时遇到了一个错误:
“无法创建抽象类或接口'GadgetTask.IDesktopGadget'的实例”


有没有人能给我指出正确的方向,同时帮助我理解我做错了什么?

要使用该接口,实际上需要DesktopGadget对象的实现。MS提供了一个标准COM对象来在Windows 7上执行此操作。您可以通过执行以下操作来创建实例:

Type t = Type.GetTypeFromCLSID(new Guid("924ccc1b-6562-4c85-8657-d177925222b6")); IDesktopGadget dg = (IDesktopGadget)Activator.CreateInstance(t); Type t=Type.GetTypeFromCLSID(新Guid(“924ccc1b-6562-4c85-8657-d177925222b6”);
IDesktopGadget dg=(IDesktopGadget)Activator.CreateInstance(t) 谢谢你的指导。要获得更直接的帮助,以下是对我有效的方法:

IDesktopGadget.cs Program.cs
谢谢你的回答。我应该用接口的类id替换那里的Guid吗?我得到一个“类未注册错误”,我不知道为什么。我从注册表中提取了接口的类id。不,Guid是对象的CLSID,而不是接口。我从SDK头文件中的CLSID_DesktopGadget定义中获得了这个Guid。谢谢,我将进一步检查它!谢谢你迄今为止的帮助。。。我现在收到一个新错误:
System.InvalidCastException:无法将类型为“System.\u ComObject”的COM对象强制转换为接口类型“IDesktopGadget”。此操作失败,因为对IID为“{924CCC1B-6562-4C85-8657-D177925222B6}”的接口的COM组件的QueryInterface调用失败,原因是以下错误:不支持此类接口(HRESULT中的异常:0x80004002(E_NOINTERFACE))。
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);
    }
}
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");
        }
   }
}