0

我对 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'"

有人可以指出我正确的方向,也许可以同时帮助我理解我做错了什么?

4

2 回答 2

1

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

类型 t = Type.GetTypeFromCLSID(new Guid("924ccc1b-6562-4c85-8657-d177925222b6"));
IDesktopGadget dg = (IDesktopGadget)Activator.CreateInstance(t);
于 2009-12-17T22:24:43.693 回答
0

感谢您的指导。对于更直接的帮助,这对我有用:

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);
    }
}

程序.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");
        }
   }
}
于 2011-07-28T01:51:48.310 回答