C# C中的CoCreateInstance()#

C# C中的CoCreateInstance()#,c#,visual-c++,com,C#,Visual C++,Com,我把一段代码从C++转换成C,但是不知道如何使用COCCREATIN()。这里是C++(这是我在C中想要的): 然后主要 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); ICOMPLA

我把一段代码从C++转换成C,但是不知道如何使用COCCREATIN()。这里是C++(这是我在C中想要的):

然后主要

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

ICOMPLATE是用C++制作的.DLL中的一个接口。我在我的C代码中引用了它。基本上我需要这段代码,因为我不能调用接口中的任何函数,除非我初始化我的设备。CoCreateInstance用C++代码做了这件事。我发布的代码无法运行,因为它无法将设备用作对象。我注意到C++代码中的设备是指针,这可能是这里需要实现的。我只是不确定

更新:我以前写代码,但他不使用接口、指针或重新解释广播

  • 某些语言(编译或脚本)如Visual Basic 6.0、VBA、VBScript、JScript具有隐藏COM对象激活详细信息的运行时。它们还检查HRESULT并将其转换为异常。它们还通过调用AddRef、Release自动管理生命周期

如果在该COM项目的IDL文件中将参数的[out]属性更改为[out,retval],然后重新生成,则可以测试以下(我的第一个C#)代码:


请注意,new之后是MyStruct,而不是Imystuct。MyStruct是idl文件中指定的名称(在我的示例中为“coclass MyStruct”,不仅前缀I不同),还需要向C#project(COMStructProviderLib)添加对已注册COM服务器的引用。通过上述链接,可以得到相应的C++ COM客户端,并与这里提供的C客户端进行比较。请注意C++客户端中的注释——CoCreateInstance是隐藏的——它是在智能指针初始化中调用的。< /P>因为在链接问题中,西蒙非常好地请求.NET加载COM对象,.NET加载它,隐藏所有丑陋的复杂性。您可以发现什么是
IID\u IComDevice
并将其放入
[Guid()]
,然后希望:-)只需在C程序中使用
Device=new IComDevice()
。@HansPassant无法创建抽象类或接口IComDevice()的实例@xanatos接受GUID,但设备不接受,因为它是一个接口而不是objectTry:IComDevice device=new-ComDevice()
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);
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);
        }
    }
}