我正在将一段代码从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?编写我的代码,但他不使用接口,指针或重新解释
答案 0 :(得分:2)
某些语言(编译或脚本编写)如Visual Basic 6.0,VBA,VBScript,JScript都有运行时隐藏COM对象的激活细节。他们还检查并将HRESULTS转换为异常。他们还管理生命周期自动调用AddRef,Release。
here is my steps how to implement simple out of proc COM server and C++ client
如果您将此参数的[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 - 它在智能指针初始化中被调用。