互联网上有大量有用的 C++ 库。我们也在这个博客上展示了C++ 的许多伟大用途。C++ 通常具有极高的性能。如果我们有 C++ 库的源代码,我们就可以创建一个包,然后我们就可以在 Delphi 程序中使用 C++。尽管 C++ 库的源代码通常不可用。在商业 C++ 库中,通常只获得几个 C++ 头文件和静态库文件 (.lib),而没有任何随附的 .cpp 源文件。因此,在这种情况下,当我们想在 Delphi 应用程序中使用那些 C++ 库时,我们可以使用代理 DLL 来实现。
如何创建一个代理DLL来连接C++ DLL和Delphi?
要将 Delphi 连接到 DLL,DLL 应该公开一个简单的 Windows API 样式 API,而不是 C++ 的东西。我们可以使用任何 C++ 编译器来编译代理 DLL。
我们举一个简单的例子。假设我们有一个 DLL 文件和一个带有此声明的更难的文件,而没有带有实现的 .cpp 文件。您可以在此链接中参考此示例的源代码:
https://github.com/PacktPublishing/Delphi-High-Performance/tree/master/Chapter%208/StaticLib1
1
2
3
4
5
6
7
8
9
10
|
#pragma once
class CppClass
{
int data;
public:
CppClass();
~CppClass();
void setData(int);
int getSquare();
};
|
下面介绍如何在带有代理dll的Delphi程序中使用C++库
现在我们需要创建代理DLL。
使用您喜欢的 IDE 创建一个新的 C++ DLL 项目。
它会自动添加“dllmain.cpp”文件。但是我们需要另一个单元来包装静态库。添加名为“StaticLibWrapper.cpp”的新单元。
现在我们应该在我们的项目中包含我们想要导入的静态库的头文件。
1
2
|
#include "stdafx.h"
#include "CppClass.h"
|
现在将静态库的头文件复制到项目文件夹中。现在我们应该在我们的项目中包含静态库。为此,将静态库文件夹添加到库目录中:
或者在 Visual Studio 中转到“配置属性 | 链接器 | 一般 | 其他库目录 设置”。
如何将 C++ DLL 函数标记为“已导出”
现在我们定义一个宏来标记 DLL 函数被导出。
1
|
#define EXPORT comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
|