C# 中的 CoCreateInstance()
CoCreateInstance() in C#
我正在将一段代码从 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? 编写我的代码,但他不使用接口、指针或重新解释转换
某些语言(编译语言或脚本语言)如 Visual Basic 6.0、VBA、VBScript、JScript 具有 隐藏 COM 对象激活细节的运行时.他们还检查 HRESULTS 并将其转换为异常。他们还管理自动调用 AddRef、Release 的生命周期。
如果你在这个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)。同样通过上面提到的 link 你可以得到相应的 C++ COM 客户端,并与这里提供的 C# 客户端进行比较。请注意 C++ 客户端中的注释 - CoCreateInstance 是隐藏的 - 它在智能指针初始化内部调用。
我正在将一段代码从 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? 编写我的代码,但他不使用接口、指针或重新解释转换
某些语言(编译语言或脚本语言)如 Visual Basic 6.0、VBA、VBScript、JScript 具有 隐藏 COM 对象激活细节的运行时.他们还检查 HRESULTS 并将其转换为异常。他们还管理自动调用 AddRef、Release 的生命周期。
如果你在这个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)。同样通过上面提到的 link 你可以得到相应的 C++ COM 客户端,并与这里提供的 C# 客户端进行比较。请注意 C++ 客户端中的注释 - CoCreateInstance 是隐藏的 - 它在智能指针初始化内部调用。