Visual c++ VC++;:使用DLL作为;“子程序”;

Visual c++ VC++;:使用DLL作为;“子程序”;,visual-c++,dll,linker,multiple-projects,Visual C++,Dll,Linker,Multiple Projects,因此,我刚刚开始尝试我的手在仿真后,多年的拖延,不知道从哪里开始,我已经成功地编写了我的第一个模拟器!现在我正在组织我的代码,以便可以重用代码来模拟其他系统。我一直在考虑拥有一个共享的前端“平台处理程序”,我将把它编译成可执行文件,而我将把模拟系统代码编译成DLL,平台处理程序将使用DLL来识别可用的内容并从中实例化。这将允许我将代码分为不同的项目,并允许我选择使用具有更多功能的大型前端或简化的“仅限游戏”,并在它们之间共享相同的DLL,而不是制作两个不同的解决方案 我知道如何编译dll和可执行

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


我知道如何编译dll和可执行文件,但我不知道如何将可执行文件链接到自定义dll,以便从中实例化类。我甚至不确定我想做的在技术上是否可行。dll类是否需要是静态的?我以前从未编写过类似的代码,甚至没有对自定义DLL做过太多的工作,因此,如果有任何帮助或想法,我将不胜感激。我用Visual C++ 2010的方式。提前感谢任何人的建议。

你真的不必做太多不同的事情。只需像导出函数一样从dll导出类。在你的应用程序中,像你通常做的那样,包括标题和到生成库的链接。见本页:

例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\u导出
并生成。您将获得
.lib
.dll
输出。在您将使用dll的主项目中,除了包含
.lib
的标题和链接外,您无需执行任何操作。不要在主项目中定义
DLL\u导出
符号,并确保
.DLL
位于应用程序可以找到的地方


如果你真的想变得聪明,这个问题就是工厂设计模式。如果界面设计得足够好,就可以让DLL在加载应用程序时将其实现注册到应用程序中。您甚至可以在不重建主可执行文件的情况下进行永久性扩展。

MSDN库对此进行了详细介绍。从这里开始读:这听起来很像我想做的。这是特定于操作系统的吗?到目前为止,我的应用程序是跨平台友好的,我真的希望保持这种方式。当我被指向MSDN的方向时,我会感到紧张,尽管这是一个很好的资源。不,我在Windows和Linux上都做过。我假设它可以在任何支持加载共享对象的平台上工作。IIRC在Linux上,您不需要做任何特殊的事情,只需创建共享对象(dll)并针对它进行链接。在Windows上,必须按照链接中的说明明确声明导出的类。我手边没有一个代码片段,我犹豫着从内存中编一个,因为我可能会错过一些东西。看看谷歌上的dllimport/dllexport。我下班回家后会再回来看看,试着提供一个更好的例子。哇,非常感谢!这看起来正是我想要做的事情。工厂方法听起来也是设置平台处理程序的完美方法。是时候掸去ol’设计模式书上的灰尘,开始编码了!