如何在c中隐藏公共API的辅助函数

时间:2010-06-10 16:48:30

标签: c api private public

我正在开发一个项目,我需要创建一个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);

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

3 个答案:

答案 0 :(得分:5)

使用

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

等使函数成为文件/编译单元的本地函数。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

如果只想公开DLL中的某些函数,可以创建在生成项目时为链接器提供的导出文件(dllname.def)。此导出文件包含要使用DLL公开提供给应用程序的功能列表。

有关详细信息,请参阅MSDN文章here

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