Несколько экземпляров DLL в C ++ - PullRequest
1 голос
/ 18 октября 2011

У меня есть 10.000 устройств, и я хочу управлять ими с помощью одного приложения C ++. Устройства являются серверными, и я могу управлять ими только через dll. Dll написан для MFC, и он не был написан мной, поэтому я ничего не могу с этим поделать.

Dll устанавливает связь TCP / IP между устройствами и моим приложением. Каждое устройство имеет разные переменные. Мне нужно открыть новый поток для каждого входящего соединения и загрузить экземпляр моей DLL. Я не мог загрузить разные экземпляры DLL для каждого потока. каждый раз, когда он использует те же DLL и те же данные.

Как можно загрузить несколько экземпляров DLL? Есть ли способ сделать это с C ++. Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 18 октября 2011

Если данные статические, невозможно иметь больше экземпляров в том же процессе. Вы должны изменить dll, чтобы иметь какие-то данные для контекста (обычно это делает экземпляр класса). В общем, в любом случае, никогда не запускает до 10000 потоков в процессе , это снижает производительность. Напишите пул потоков и позвольте клиенту управлять этим пулом.

1 голос
/ 18 октября 2011

Ваша ситуация не выглядит обнадеживающей.

Windows не будет загружать более одного экземпляра DLL внутри данного процесса, никогда.Если сама DLL не имеет функции для подключения к нескольким серверам, вам придется создать отдельный процесс для каждого сервера, к которому нужно подключиться.На практике это была бы плохая идея.

Вы МОЖЕТЕ использовать LoadLibrary () и UnloadLibrary (), чтобы «перезапустить» DLL несколько раз и таким образом неистово переключаться между различными серверами.В некотором роде LoadLibrary () ... беспорядок с сервером ... UnloadLibrary () ... сделать это снова, снова и снова в ситуации.Это было бы больно и медленно, но могло бы работать на вас.

0 голосов
/ 19 октября 2011

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

Загрузите копию с помощью LoadLibrary и настройте соответствующие функциональные указатели (GetProcAddress(...)) для функций во вновь загруженной dll для использования в вашей программе.

После того, как вы закончите, выгрузите копию с помощью FreeLibrary и удалите копию с диска.

0 голосов
/ 18 октября 2011

Я не вижу простого решения этой проблемы, как уже говорилось ранее, вы не можете создать несколько экземпляров DLL в приложении.

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

Тем не менее, с 10k устройствами производительность будет ужасной. Похоже, что лучшее решение - либо заново реализовать протокол (либо использовать опубликованную спецификацию, либо перепроектировать ее).

...