【问题标题】:How to add new functions to a COM .dll created by a Visual Studio C++ ATL Project如何将新函数添加到由 Visual Studio C++ ATL 项目创建的 COM .dll
【发布时间】:2011-08-09 15:02:01
【问题描述】:

我正在尝试创建一个非常基本的 COM dll 以包含在 C# 项目中,然后用于将一些 C++ 功能包装到 COM 模块中以包含在 C# 项目中(其余代码使用的语言基础)。

我包含了 COM dll,向 COM dll 添加了一个类,并在 C# 代码中对其进行了实例化,但到目前为止,我还无法向新类添加新功能。

这就是我所做的:

  1. 新的 Visual C# Windows 窗体应用程序
  2. 右键解决方案->添加->新建项目...
  3. 添加新的 Visual C++ ATL 项目(称为 MyCOMDLL)
  4. 在 ATL 项目向导中选择的默认选项(我也尝试勾选“支持 COM+ 1.0”)
  5. 右键MyCOMDLL项目->添加->类
  6. 添加新的 Visual C++ ATL COM+ 1.0 组件
  7. 在短名称中键入“MyCOMObject”,这会自动填充“名称”选项卡中的其他字段
  8. 其他设置保持默认
  9. 构建 MyCOMDLL 项目
  10. 向 C# Windows 窗体应用程序添加对新 MyCOMDLL.dll 的引用
  11. 右键单击 C# Windows 窗体应用程序项目->属性
  12. 在 Build 选项卡上将 Platform target 设置为 x86
  13. 添加“使用 MyCOMDLLLib;”到 Form1.cs 文件
  14. 在表单中添加一个按钮并在按钮点击函数中添加

MyCOMDLLLib.MyCOMObjectClass myVariable = new MyCOMObjectClass();

我已经尝试了各种方法,所以除了这里最明显的之外,我不会列出任何东西 - 我尝试向 MyCOMObject.h 添加一个类方法:

// CMyCOMObject
class ATL_NO_VTABLE CMyCOMObject :
    public CComObjectRootEx,
    public CComCoClass,
    public IDispatchImpl
{
public:
    CMyCOMObject()
    {
    }

DECLARE_PROTECT_FINAL_CONSTRUCT()

HRESULT FinalConstruct()
{
    return S_OK;
}

void FinalRelease()
{
}

DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMOBJECT)

DECLARE_NOT_AGGREGATABLE(CMyCOMObject)

BEGIN_COM_MAP(CMyCOMObject) COM_INTERFACE_ENTRY(IMyCOMObject) COM_INTERFACE_ENTRY(IDispatch) END_COM_MAP()

// IMyCOMObject public: // SB: My attempt at adding a new method int ReturnTwo() { return 2; } };

ReturnTwo 方法在 C# Windows 窗体应用程序项目的 CMyCOMObject 的类视图中可见,但在 MyCOMObjectClass 的类视图中不可见。

非常感谢任何帮助。

【问题讨论】:

    标签: c# c++ com interop


    【解决方案1】:

    我尝试向 MyCOMObject.h 添加一个类方法

    这还不够好。项目中最重要的文件是 .idl 文件(接口描述语言)。该文件生成嵌入在 DLL 中的类型库。类型库是 .NET 用来生成托管导入库的。您添加的函数不会在那里,因为您没有修改 .idl 文件。

    手动修改界面很痛苦,有三个地方需要修改。 .idl、.h 和 .cpp 文件。最好使用向导完成。在类视图窗口中,右键单击接口(如 IFoo)、添加、添加方法(或属性)。然后切换到.cpp文件写方法的实现。

    【讨论】:

    • 完美运行,谢谢!成功地使用向导添加了在 C# 应用程序中可见的方法和属性,但作为其他任何人的仅供参考,您在添加方法/属性时需要摆脱以前生成的互操作 DLL。
    【解决方案2】:

    您是否再次将新构建的 dll 复制到 C# 项目中?

    【讨论】:

    • 尝试从 C# 项目中删除引用,删除生成的 Interop.MyCOMDLLLib.dll 并重新添加引用。在首先构建和添加到 C# 项目之前,还尝试将函数和变量添加到 .dll 中。两种情况都没有乐趣。
    • 想通了。只是值得一试。您可能在 COM 注册时遇到问题。您通常需要为 COM 注册 dll,我认为 C# 只有在您也使用 C# 构建 dll 时才会自动注册。
    • 感谢 Sogger 的建议。不幸的是,我很确定这不是注册问题。我之前确实遇到了一些与注册相关的问题。将 C# 项目设置为为 x86 构建并(之前未提及)以管理员身份运行 Visual Studio 使这些都消失了。我认为如果不注册 COM dll,我将无法在运行时实例化该类。
    • 好吧,我在想你可以通过以前注册的旧版本的接口来实例化你的类,这可以解释你的问题。
    猜你喜欢
    • 2012-01-19
    • 2011-06-27
    • 2013-06-10
    • 1970-01-01
    • 2016-06-09
    • 2010-09-09
    • 2013-06-21
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多