6

我正在做一个项目,我需要创建一个 API。我正在使用套接字在服务器(我的应用程序)和客户端(使用我的 API 的其他应用程序)之间进行通信。

这个项目是 c 而不是 C++

我来自 linux 背景,这是我第一个使用 Windows、Visual Studio 2008 和 dll 库的项目。

我在客户端和服务器之间进行了通信,但我有一些在两个项目中重复。我想创建一个库(可能是一个 dll 文件),这两个项目都可以链接到,所以我不必维护额外的代码。

我还必须创建包含我需要为我的客户提供的 API 的库。在我想要公开的 API 函数中,是对这些“重复代码”的辅助函数的调用,我不想将这些函数公开给我的客户端,但我确实希望我的服务器能够使用这些函数。我怎样才能做到这一点?

我将尝试用一个例子来澄清。这就是我开始的。

服务器项目:

int Server_GetPacket(SOCKET sd);
int ReceiveAll(SOCKET sd, char *buf, int len);
int VerifyLen(char *buf);

客户项目:

int Client_SendCommand(int command);
int Client_GetData(int command, char *buf, int len);
int ReceiveAll(SOCKET sd, char *buf, int len);
int VerifyLen(char *buf);

这就是我想要的结果:

//Server Project:
int Server_GetPacket(SOCKET sd);

// library with public and private types
//  private API (not exposed to my client)
int ReceiveAll(SOCKET sd, char *buf, int len);
int VerifyLen(char *buf);
//  public API (header file available for client)
int Client_SendCommand(int command);
int Client_GetData(int command, char *buf, int len);

感谢任何帮助将不胜感激。

4

3 回答 3

5

采用

static int ReceiveAll(SOCKET sd, char *buf, int len);

等使函数本地化到文件/编译单元。

于 2010-06-10T16:49:57.000 回答
1

如果您将“私有”函数放在 DLL 中并通过正常方式使它们可在外部调用(例如,可由加载库的进程调用),那么它们对于其他人也将是“公共的”。可以混淆名称和类似的东西,但这可能不是一个好的解决方案。

将它们放入静态链接库而不是 DLL 可能会更好。但请注意,即使在这种情况下,也有人可以明显地反汇编二进制文件并获取代码。

于 2010-06-10T16:52:28.707 回答
0

如果您只想公开 DLL 中的某些函数,您可以创建一个导出文件 (dllname.def),在构建项目时将其提供给链接器。此导出文件包含您希望使用您的 DLL 的应用程序公开可用的函数列表。

有关这方面的更多信息,请参阅此处的 MSDN 文章。

我认为您也可以通过__declspec(dllexport)在要导出的功能上使用关键字来实现类似的功能。

于 2010-06-10T16:59:52.907 回答