2012-02-10 46 views
3

我已经多次被告知我应该考虑将应用程序的各个部分拆分为单独的DLL(以加速链接等),并试图弄清楚作品。如何将C++ Builder应用程序拆分为DLL

据我所知,我需要将__declspec(dllexport)添加到我打算使用的每个头文件声明中。这似乎很乏味,但它是可行的。

如何获取应用程序+ DLL运行?在一个简单的测试项目中,我发现的唯一方法是将DLL项目的构建输出目录中的DLL手动复制到exe项目的构建输出目录中。我知道我可以设置一个构建后步骤来完成这个任务,但是我希望IDE有一些方法可以让应用程序项目在同一个项目组中的一部分时使用DLL项目自动化。

如何调试应用程序+ DLL?我在Project - > Options - > Debugger下看到了我可以在哪里指定DLL的主机应用程序,但到目前为止,我只能弄清楚如何一次调试一个项目。我真的希望能够在代码库中的任何地方设置断点,并且能够在代码库中的任何位置单步设置断点(而不是停在项目边界),而且我无法弄清楚如何实现这一点。

回答

3

据我所知,我需要添加__declspec(dllexport)到每个标头 我打算使用的文件声明。这似乎很乏味,但它是 可行。

你应该做的是建立在你的DLL的头文件中的#define映射时,报头由DLL项目编译DLLEXPORT和地图在其他项目编制时的DllImport。例如:

#ifndef MyDLLH 
#define MyDLLH 

#ifdef _BUILDING_DLL_ 
#define MY_EXPORT __declspec(dllexport) 
#else 
#define MY_EXPORT __declspec(dllimport) 
#endif 

#ifdef __cplusplus 
extern "C" { 
#endif 

MY_EXPORT type callingconvention SomeFunc(parameters); 
#ifdef __cplusplus 
} 
#endif 

#endif 

然后你就可以在你的只有DLL项目定义_BUILDING_DLL_,无论是在项目选项的条件语句列表,或在你的代码上面的头文件中的任何#include语句,如:

#define _BUILDING_DLL_ 
#include "MyDll.h" 

如何获取应用程序+ DLL运行?

DLL项目生成一个.lib文件,用于静态链接到DLL的导出函数。您可以将.lib文件添加到您的EXE项目中,然后像调用其他任何函数一样调用DLL函数。或者,您可以使用Win32 API LoadLibrary()和GetProcAddress()函数在运行时动态加载DLL函数,在这种情况下,根本不使用.lib文件。

在一个简单的测试项目中,我发现的唯一方式的工作原理是 从DLL项目的构建输出目录下的DLL手动复制到 的exe项目的构建输出目录。

EXE文件夹是操作系统查找DLL的第一个位置,但它不是操作系统可以查看的唯一位置。MSDN文档如何DLL被定位在运行时:

Dynamic-Link Library Search Order

我知道我可以设置生成后步骤来做到这一点,但是我希望在 IDE有一些方法来自动化其当一个应用程序项目属于同一个项目组时,应用程序项目会使用DLL项目 。

只是作为同一项目组的一部分是不够的。这些项目是独立编译的。但是,您可以设置DLL项目为EXE项目的扶养(或只需确保DLL projct是构建顺序那么EXE项目上上涨),因此DLL首先编译,然后使用DLL的PostBuild事件移动编译后的.lib和.dll二进制文件,最后将DLL的编译后的.lib文件添加到EXE项目中,以便在运行时使用该DLL。

如何调试应用程序的DLL +?

你有两个选择:

要单独调试只是DLL,DLL项目加载到IDE中,进入运行参数,并设置编译EXE在主机应用程序。然后,您可以像运行EXE项目一样运行DLL项目。 EXE将被执行,并且一旦将DLL加载到内存中,调试器就会连接到DLL。

要在同一时间调试这两个项目中,EXE项目加载到IDE替代,并确保该DLL的源文件夹中的项目选项的调试周守军指定路径。然后,您可以正常运行的EXE工程,DLL的源步入DLL函数被调用时,设置断点等

+1

,我发现必须在同一时间调试这两个项目一个额外的步骤:复制' .tds'文件(调试器符号)从DLL输出目录移动到“.dll”文件将驻留在应用程序的任何位置。 – 2012-02-10 19:48:30

+0

@乔什 - 凯利:我已经能够不复制,如果我设置了'.exe'项目的“工作目录”包含了'.dll'和'.tds'文件的路径,可以同时调试。在C++ Builder XE下,在“项目选项”>“调试器”下找到“工作目录”选项。 – Pete 2013-03-19 17:30:31