Как скрыть вспомогательные функции от публичного API в C - PullRequest
5 голосов
/ 10 июня 2010

Я работаю над проектом, и мне нужно создать API.Я использую сокеты для связи между сервером (мое приложение) и клиентами (другие приложения используют мой API).

Этот проект не на 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 ]

5 голосов
/ 10 июня 2010

Используйте

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

и т. Д., Чтобы сделать функции локальными для файла / модуля компиляции.

1 голос
/ 10 июня 2010

Если вы поместите «частные» функции в DLL и сделаете их внешне вызываемыми обычными средствами (например, вызываемыми процессом, который загружает библиотеку), то они будут «публичными» и для других. Можно запутать имена и тому подобное, но это, вероятно, не очень хорошее решение.

Может быть, лучше поместить их в статически связанную библиотеку, а не в DLL. Обратите внимание, однако, что даже в этом случае кто-то может явно разобрать двоичный файл и получить код.

0 голосов
/ 10 июня 2010

Если вы хотите предоставить только определенные функции в вашей DLL, вы можете создать файл экспорта (dllname.def), который вы дадите компоновщику при сборке проекта.Этот файл экспорта содержит список функций, которые вы хотите сделать общедоступными для приложений, использующих вашу DLL.

См. Статью MSDN здесь для получения дополнительной информации об этом.

Я думаю, что вы также можете достичь аналогичной функциональности, используя ключевое слово __declspec(dllexport) для функций, которые вы хотитеэкспорт.

...