2014-01-31 1 views
1

Я рассматриваю попытку написать COM-объект с использованием C#, который реализует объект службы OPOS. Я сделал это на C++, используя Automation и MFC, и это было не слишком сложно. Поэтому я застрял на одном из методов, пытающихся преобразовать его. Я исключу другие методы в интерфейсе, так как они прямолинейны (или я надеюсь).как положить IDispatch * в управляемый код

[id(6), helpstring("method OpenService")] 
LONG OpenService(BSTR lpclDevClass, BSTR lpclDevName, IDispatch* lpDispatch); 

Мой код C# выглядит примерно так, но я застрял на OpenService.

[ComVisible(true)] 
[Guid("76F8309C-3837-4065-960F-BE156383896D")] 
[ClassInterface(ClassInterfaceType.AutoDispatch)] 
public class IErtMSR 
{ 
    [DispId(1)] 
    int COFreezeEvents([MarshalAs(UnmanagedType.VariantBool)] bool Freeze); 
    [DispId(2)] 
    int GetPropertyNumber([In] int lPropIndex); 
    [DispId(3)] 
    void SetPropertyNumber([In] int lPropIndex, [In] int nNewValue); 
    [DispId(4), MarshalAs(UnmanagedType.BStr)] 
    string GetPropertyString([In] int lPropIndex); 
    [DispId(5)] 
    void SetPropertyString([In, MarshalAs(UnmanagedType.BStr)] string StringData); 
    [DispId(6)] 
    int OpenService([In, MarshalAs(UnmanagedType.BStr)] string lpclDevClass, [In, MarshalAs(UnmanagedType.BStr)] string lpclDevName, IDispatch* lpDispatch); 
    //...the rest of the 24 methods. 
} 

как вы можете видеть Я не знаю, что положить на IDispatch *. Что я могу использовать в этом случае?

+0

Я понял. Мне пришлось создать метод IDispatch (который я обнаружил, что у Hans Persant был доступный ...) Теперь мне просто нужно выяснить, как вызвать из него событие .. :) –

ответ

1

Вам не нужно создавать управляемое определение для COM IDispatch или реализовать его элементы явно. У Framework есть встроенная поддержка. Просто объявите OpenService следующим образом:

[DispId(6)] 
int OpenService(
    [In, MarshalAs(UnmanagedType.BStr)] string lpclDevClass, 
    [In, MarshalAs(UnmanagedType.BStr)] string lpclDevName, 
    [In, MarshalAs(UnmanagedType.IDispatch] object lpDispatch); 
+0

В моей голове я вижу, что это работает отлично, но подпись говорит IDispatch *. Должен ли я сделать это 'ref object lpDispatch'? –

+0

@RobertSnyder, no, 'ref object' означает, что из вызова можно вернуть объект IDispatch. Это будет отображаться на '[in, out] IDispatch ** p' в IDL. Просто убедитесь, что «объект», который вы передаете, реализует интерфейс, совместимый с IDispatch, например: '[InterfaceType (ComInterfaceType.InterfaceIsDual] интерфейс ITest {/ * ... * /}'. Вы также можете использовать '[ClassInterface (ClassInterfaceType.AutoDispatch/AutoDual)] 'в классе' class', но я бы придерживался отдельного интерфейса, такого как 'ITest' и' [ComDefaultInterface (typeof (ITest))] в классе. – Noseratio

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

  • Нет связанных вопросов^_^