【问题标题】:How call virtual function in COM in C#如何在 C# 中调用 COM 中的虚函数
【发布时间】:2018-04-08 07:25:40
【问题描述】:

我是 COM 和 C# 的新手。我想做的是用 C# 重写以下源代码:

explife.c

explife.h

typedef interface IARPUninstallStringLauncher IARPUninstallStringLauncher;

typedef struct IARPUninstallStringLauncherVtbl {

BEGIN_INTERFACE

    HRESULT(STDMETHODCALLTYPE *QueryInterface)(
        __RPC__in IARPUninstallStringLauncher * This,
        __RPC__in REFIID riid,
        _COM_Outptr_  void **ppvObject);

    ULONG(STDMETHODCALLTYPE *AddRef)(
        __RPC__in IARPUninstallStringLauncher * This);

    ULONG(STDMETHODCALLTYPE *Release)(
        __RPC__in IARPUninstallStringLauncher * This);

    HRESULT(STDMETHODCALLTYPE *LaunchUninstallStringAndWait)(
        __RPC__in IARPUninstallStringLauncher * This,
        _In_ HKEY hKey,
        _In_ LPCOLESTR Item,
        _In_ BOOL bModify,
        _In_ HWND hWnd);

    HRESULT(STDMETHODCALLTYPE *RemoveBrokenItemFromInstalledProgramsList)(
        __RPC__in IARPUninstallStringLauncher * This,
        _In_ HKEY hKey,
        _In_ LPCOLESTR Item);

END_INTERFACE

} *PIARPUninstallStringLauncherVtbl;

interface IARPUninstallStringLauncher
{
  CONST_VTBL struct IARPUninstallStringLauncherVtbl *lpVtbl;
};

据我了解,他反转了这个接口中的函数并创建了一个结构,以便他可以访问这个虚函数的地址。

此 COM 中的函数在 OLEVIEW 中不可见,我也无法在 VisualStudio 中导入它。

我的问题是可以用 C# 编写吗?

【问题讨论】:

    标签: c# com virtual-functions oleview


    【解决方案1】:

    这将是一个 C# 等价物(您不需要定义 IUnknown 方法,this 是隐含的):

    [Guid("F885120E-3789-4FD9-865E-DC9B4A6412D2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IARPUninstallStringLauncher
    {
        [PreserveSig]
        int LaunchUninstallStringAndWait(
                IntPtr hKey,
                [MarshalAs(UnmanagedType.LPWStr)] string Item,
                bool bModify,
                IntPtr hWnd);
    
        [PreserveSig]
        int RemoveBrokenItemFromInstalledProgramsList(
            IntPtr hKey,
            [MarshalAs(UnmanagedType.LPWStr)] string Item);
    }
    

    您可以像这样声明 coclass(是的,使用一个空的主体)

    [Guid("FCC74B77-EC3E-4DD8-A80B-008A702075A9"), ComImport]
    public class UninstallStringLauncher
    {
    }
    

    而要创建和使用对象,可以试试这样的代码

    var launcher = (IARPUninstallStringLauncher)new UninstallStringLauncher();
    

    并确保您的 COM 对象的位数 (x86/x64) 与您的 C# 应用程序的位数相匹配。

    【讨论】:

    • 对象 obj; int f= CoCreateInstance(ref T_CLSID_UninstallStringLauncher, null, (uint)(CLSCTX.CLSCTX_INPROC_SERVER | CLSCTX.CLSCTX_LOCAL_SERVER | CLSCTX.CLSCTX_INPROC_HANDLER), ref T_IID_IARPUninstallStringLauncher, out obj); d = (IARPUninstallStringLauncher)obj;
    猜你喜欢
    • 2019-06-26
    • 2011-07-03
    • 2020-07-02
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多