C#中的CoCreateInstance()

时间:2015-06-26 13:40:02

标签: c# visual-c++ com

我正在将一段代码从c ++转换为c#,但我不确定如何使用CoCreateInstance()。这是c ++(这是有效的,也是我想要的C#):

IComDevice *Device=NULL;
HRESULT hr = CoCreateInstance(
    __uuidof(ComDevice),
    NULL,
    1,
    IID_IComDevice,
    reinterpret_cast<void **>(&Device)
    );

以下是我认为可以在c#

中使用的内容
public class Ole32Methods
{
  [DllImport("ole32.Dll")]
  static public extern uint CoCreateInstance(ref Guid clsid, [MarshalAs(UnmanagedType.IUnknown)] object inner, uint context, ref Guid uuid, [MarshalAs(UnmanagedType.IUnknown)] out object rReturnedComObject);
}

然后在主

IComDevice Device;
uint duh = 1;
Guid uuid=typeof(ComDevice).GUID;
Guid uuid2 = typeof(IComDevice).GUID;
Ole32Methods.CoCreateInstance(ref uuid, null, duh, ref uuid2, out Device);

IComDevice是用c ++编写的.dll中的一个接口。我在我的C#代码中引用它。基本上我需要这个代码,因为我不能调用接口中的任何函数,除非我初始化我的设备。 CoCreateInstance在我的C ++代码中这样做。我发布的代码没有运行,因为它无法使用Device作为对象。我注意到在C ++代码中,Device是一个指针,这可能是在这里实现的东西。我只是不确定。

更新:我使用CoCreateInstance exact match in .NET?编写我的代码,但他不使用接口,指针或重新解释

1 个答案:

答案 0 :(得分:2)

如果您将此参数的[out]属性更改为此COM项目的IDL文件中的[out,retval]并重建,那么您可以测试以下(我的第一个C#)代码:

using System;

using COMStructProviderLib;

namespace CSharpCOMClient
{
    class Program
    {
        static void Main(string[] args)
        {
            IMyStruct mystruct = new MyStruct();
            mystruct.setName("John");
            String name = mystruct.getName();
            Console.WriteLine(name);
            mystruct.setAge(5);
            long age = mystruct.getAge();
            Console.WriteLine(age);
        }
    }
}

请注意新的 MyStruct后 - 不是IMyStruct 。 MyStruct是idl文件中指示的名称(在我的示例中为“coclass MyStruct”,不仅可以通过前缀I而不同)还需要将已注册的COM服务器的引用添加到C#项目(COMStructProviderLib)。也可以通过上面提到的链接获得相应的C ++ COM客户端,并与此处提供的C#客户端进行比较。请注意C ++客户端中的注释 - 隐藏CoCreateInstance - 它在智能指针初始化中被调用。