2013-04-13 32 views
3

我已經在進程內(DLL)COM服務器,但我落戶作爲DllSurrogate運行,爲此從非託管代碼(德爾福)我有:CoCreateInstance在.NET中完全匹配?

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不幫助我。我必須設定明確的運行上下文(第三個參數)

+0

沒有什麼不安全的關於正確的pinvoke聲明。請注意,您從來不必在任何地方使用* unsafe *關鍵字。 –

+0

@HansPassant,這樣''CoCreateInstance'在'unsafe {...}'中包裝是沒用的? – ALZ

+0

你不能在代碼中將它作爲COM組件運行嗎? –

回答

4

你也可以這樣做:

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

,創建這樣的COM對象的實例:

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

不使用P /調用。

+0

COM課後關鍵字是什麼? – vkrzv

+0

這是一個錯字。我已經更新了我的答案。 –