2010-06-10 59 views
5

我正在开发一个项目,我需要创建一个API。我使用套接字在服务器(我的应用程序)和客户端(使用我的API的其他应用程序)之间进行通信。如何隐藏帮助函数c中的公共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); 

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

回答

1

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

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

+0

我更关心提供一个只包含公共函数的干净的API。我只是想避免让所有的帮助函数成为API的一部分。 你是说我为“私人”功能创建一个静态库,然后把“公共API”函数放入DLL中? – emge 2010-06-10 17:01:30

+0

@emge:这是一种可能性。这取决于你的开发架构是否合理。一个“更简单”的解决方案是简单地将源文件包含在项目中,并直接将其构建到二进制文件中。然后使用所需的导出函数将公共API DLL作为单独项目构建。 – 2010-06-10 17:04:45

+0

谢谢,我喜欢“更简单”的解决方案,但是如果我只是将源文件包含在我的项目中,并且API DLL需要使用某些相同的函数,我该如何解决重复代码的问题? – emge 2010-06-10 17:09:39

5

使用

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

等,使功能本地文件/编译单元。

+0

如果我声明私有函数为静态并将它们放在一个库中,我可以从我的服务器项目,即从Server_GetPacket()调用它吗? – emge 2010-06-10 17:04:12

+0

相同*文件*中的函数将会看到它们。其他人不会。 – 2010-06-10 17:10:08

0

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

有关更多信息,请参阅MSDN文章here

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