2015-06-26 7 views
1

Я конвертирую кусок кода из C++ в C#, но не уверен, как использовать CoCreateInstance(). Вот с ++ (это работает, и это то, что я хочу в C#):CoCreateInstance() в 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 - это интерфейс в .dll, выполненный в C++. Я ссылаюсь на него в своем коде на C#. В принципе мне нужен этот код, потому что я не могу вызывать какие-либо функции в интерфейсе, если я не инициализирую свое устройство. CoCreateInstance делал это в моем коде на C++. Код, который я опубликовал, не запускается, потому что он не может использовать устройство как объект. Я заметил, что в коде C++ Device является указателем, который может быть реализован здесь. Я просто не уверен.

UPDATE: Я использовал CoCreateInstance exact match in .NET? написать свой код, но его не использует интерфейс, указатели, или reinterpretcast

+0

Поскольку в связанном вопросе Саймон очень хорошо просит .NET загрузить COM-объект, а .NET загружает его, скрывая всю уродливую сложность. Вы узнаете, что такое 'IID_IComDevice', и поместите его в' [Guid()] ', а затем надейтесь :-) – xanatos

+0

Просто используйте' Device = new IComDevice() 'в программе на C#. –

+0

@HansPassant Невозможно создать экземпляр абстрактного класса или интерфейса IComDevice() –

ответ

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

Если вы меняете [из] атрибутов параметров кода [выход, RetVal] в IDL файле этого COM-проекта и восстановить, то вы можете проверить следующее (мой первый 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 скрыт - он вызывается внутри инициализации интеллектуального указателя.

+0

Это решило спасибо! –

Смежные вопросы