【问题标题】:CoCreateInstance exact match in .NET?.NET 中的 CoCreateInstance 完全匹配?
【发布时间】:2013-04-13 11:51:51
【问题描述】:

我有进程内 (DLL) COM 服务器,但我决定以 DllSurrogate 的身份运行,因此来自非托管代码 (Delphi) 我有:

function TComWrapper.GetServer: IUnknown;
begin
  OleCheck(CoCreateInstance(ServerData^.ClassId, nil, CLSCTX_LOCAL_SERVER, IUnknown, Result));
end;

来自 C# 正在使用:

[DllImport("ole32.dll", EntryPoint = "CoCreateInstance", CallingConvention = CallingConvention.StdCall)]
static extern UInt32 CoCreateInstance([In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
   IntPtr pUnkOuter, UInt32 dwClsContext, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid,
   [MarshalAs(UnmanagedType.IUnknown)] out object rReturnedComObject);

...

            UInt32 dwRes = CoCreateInstance(ClassIdGuid,
                                            IntPtr.Zero,
                                            (uint)(CLSCTX.CLSCTX_LOCAL_SERVER), //if OR with CLSCTX_INPROC_SERVER then INPROC Server will be created, because of DLL COM Server
                                            IUnknownGuid,
                                            out instance);

以上代码不安全。 是否存在高于CoCreateInstance 的安全版本? 看来Activator.CreateInstance 对我没有帮助。我必须明确设置运行上下文(第三个参数)

【问题讨论】:

  • 正确的 pinvoke 声明没有什么不安全的。请注意,您永远不必在任何地方使用 unsafe 关键字。
  • @HansPassant,所以将CoCreateInstance 包裹在unsafe{...} 中是没有用的?
  • 你不能在你的代码中把它作为一个 COM 组件运行吗?
  • @ALZ 是的。 unsafe 块基本上是用于不安全的指针操作,你什么也没做。

标签: c# .net windows com interop


【解决方案1】:

你也可以这样做:

[ComImport]
[Guid(YourGuidGoesHere)]
private class MyClass
{
}

并像这样创建 COM 对象的实例:

  IYourInterface myClass = (IYourInterface)(new MyClass());

不使用 p/invoke。

【讨论】:

  • class关键字后面的COM是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多