我正在开发一个项目,我需要创建一个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);
感谢任何帮助将不胜感激。
答案 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)
关键字来实现类似的功能。