【问题标题】:Using a non-COM object from a COM dll使用 COM dll 中的非 COM 对象
【发布时间】:2017-02-15 18:29:41
【问题描述】:

Visual Studio C++ 解决方案由两个 C++ 项目组成:

  • 客户端生成client.exe
  • Algo 生成一个 algo.dll

客户端和 Algo 通过 COM 层进行通信,因此 Algo 是一个 COM dll。

我想在Algo.dll中添加一个函数,直接从Client调用,避开COM层,但是没有成功解决构建Client.exe时出现的“未解析符号”链接错误


尝试了什么?

在 Algo 项目中,我添加了 LIBRARY_EXPORT 预处理器定义和以下文件: 测试文件.h

#ifdef LIBRARY_EXPORTS
#    define LIBRARY_API __declspec(dllexport)
#else
#    define LIBRARY_API __declspec(dllimport)
#endif

extern "C"  LIBRARY_API bool __stdcall TestFunction();

TestFile.cpp

extern "C"  LIBRARY_API bool __stdcall TestFunction()
{
    return true;
}

在客户端项目中,有调用TestFunction();

构建客户端时出现链接错误: 未解析的外部符号“__declspec(dllimport) bool __cdecl TestFunction(void)

显然,我没有正确了解如何导出/导入我的函数。

【问题讨论】:

    标签: c++ dll com dllimport dllexport


    【解决方案1】:

    您需要将algo.lib添加到client.exe的链接器输入文件中

    【讨论】:

    • 链接就好了。所以 COM 调用在没有这个输入库的情况下被解析?
    • @Palmira - 要让 com 成功,您基本上只需要链接(或者实际上如果您的客户端语言不是 c++,则重新定义)接口定义(布局和 guid)和 coclasses(guid)。使用自动化/IDispatch,您不会链接到任何内容,它被称为“后期绑定”。这就是它的美妙之处,有点。
    • LIBRARY_EXPORTS 未定义时,您可以通过在标题中添加#pragma comment(lib, "algo.lib") 来记录此库依赖关系。
    猜你喜欢
    • 2012-09-22
    • 2013-10-08
    • 1970-01-01
    • 2010-11-08
    • 2012-11-01
    • 2015-02-22
    • 2012-06-20
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多