我一直在考虑尝试使用实现OPOS服务对象的C#编写COM对象。我已经在C ++中使用Automation和MFC完成了这一任务,这并不难。因此,我陷入了尝试将其转换过来的方法之一。我会在界面中排除其他方法,因为它们很简单(或者我希望如此)。

[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 *输入什么。在这种情况下我该怎么用?

最佳答案

您无需为COM IDispatch创建托管定义或显式实现其成员。该框架具有内置支持。只需这样声明您的OpenService

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

关于c# - 如何将IDispatch *放入托管代码中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21472700/

10-09 05:16