【问题标题】:VC++: Using DLLs as "subprograms"VC++:将 DLL 用作“子程序”
【发布时间】:2011-03-16 17:56:08
【问题描述】:

所以我刚刚开始尝试仿真,经过多年的拖延,不知道从哪里开始,我已经成功地编写了我的第一个仿真器!现在我正在组织我的代码,以便我可以重用代码来模拟其他系统。我一直在考虑拥有一个共享前端“平台处理程序”的想法,我将其编译为我的可执行文件,而我会将我的模拟系统代码编译成平台处理程序将用来识别可用内容并从中实例化的 dll .这将允许我将我的代码分成不同的项目,并保留使用具有更多功能的笨重前端或简化的“仅限游戏”的选项,并在它们之间共享相同的 dll,而不是制作两个不同的解决方案。

我知道如何编译 dll 与可执行文件,但我不知道如何将可执行文件链接到自定义 dll,以便我可以从中实例化一个类。我什至不确定我正在尝试做的事情在技术上是否可行。 dll类需要是静态的吗?我以前从未编写过这样的代码,甚至从未使用自定义 dll 做过很多事情,因此我将不胜感激任何帮助或想法。顺便说一句,我正在使用 Visual C++ 2010。提前感谢任何人的任何建议。

【问题讨论】:

标签: visual-c++ dll linker multiple-projects


【解决方案1】:

你真的不需要做很多不同的事情。只需像导出函数一样从 dll 中导出类。在您的应用程序中,像往常一样包含生成的库的标题和链接。看到这个页面:http://msdn.microsoft.com/en-us/library/81h27t8c%28v=vs.80%29.aspx

例子.h

#ifdef DLL_EXPORT
#define EXPORT_API __declspec(dllexport)
#else
#define EXPORT_API __declspec(dllimport)
#endif

class EXPORT_API Example
{
public:
    Example();
    ~Example();

    int SomeMethod();
};

int EXPORT_API ExampleFuncion();

Example.cpp

#include "Example.h"

Example::Example()
{
    // construct stuff
}

Example::~Example()
{
    // destruct stuff
}

int Example::SomeMethod()
{
    // do stuff
    return 0;
}

int EXPORT_API ExampleFunction()
{
    return 0;
}

在您的 dll 项目中,定义 DLL_EXPORT 并构建。您将获得.lib.dll 输出。在您将使用 dll 的主项目中,您无需执行任何操作,除了包含标题和针对 .lib 的链接。不要在主项目中定义 DLL_EXPORT 符号,并确保 .dll 在您的应用程序可以找到的位置。

如果你真的想变得聪明,这个问题是工厂设计模式的尖叫。如果你的界面设计得足够好,你可以让你的 dll 在加载时将它们的实现注册到你的应用程序中。您可以永远扩展,甚至无需重新构建您的主可执行文件。

【讨论】:

  • 这听起来很像我想做的事。这个操作系统是特定的吗?到目前为止,我的应用程序是跨平台友好的,我真的很想保持这种方式。当我被指向 MSDN 的方向时,我会感到紧张,尽管它是一个很好的资源。
  • 不,我在 Windows 和 Linux 上都做过。我假设它适用于任何支持加载共享对象的平台。在 Linux 上的 IIRC,您不必做任何特别的事情,只需创建共享对象 (dll) 并链接它。在 Windows 上,您必须按照链接中的说明将类明确声明为导出。我手边没有代码 sn-p 并且我犹豫要从记忆中弥补一个,因为我可能会错过一些东西。看看谷歌上的 dllimport/dllexport。我下班回家后会回来查看并尝试提供更好的示例。
  • 哇,非常感谢!这看起来正是我想做的事情。工厂方法听起来也是设置平台处理程序的完美方式。是时候从旧的设计模式书籍中除尘并开始编码了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 2023-03-12
相关资源
最近更新 更多