2010-06-10 60 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)關鍵字來實現類似的功能。