gpt4 book ai didi

c# - C# 中的 CoCreateInstance()

转载 作者:行者123 更新时间:2023-11-30 21:56:55 25 4
gpt4 key购买 nike

我正在将一段代码从 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 中的一个接口(interface)。我在我的 C# 代码中引用了它。基本上我需要这段代码,因为除非我初始化我的设备,否则我不能调用界面中的任何函数。 CoCreateInstance 在我的 C++ 代码中这样做。我发布的代码没有运行,因为它不能使用 Device 作为对象。我注意到在 C++ 代码中 Device 是一个指针,这可能是要在这里实现的东西。我只是不确定。

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

最佳答案

如果您在这个 COM 项目的 IDL 文件中将参数的 [out] 属性更改为 [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);
}
}
}

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

关于c# - C# 中的 CoCreateInstance(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31074743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com