Здравствуйте, TarasCo, Вы писали:
W>>А что есть разница, если я сам вызову у себя WSPCleanup и откуда то из другой части программы вызовут ?
TC>большая разница. WSPCleanup вызывается когда Ваш провайдер больше не нужен, когда больше никто не использует его ресурсы ( сокеты и.т.д )
Ну так, на примере браузера смотрим
Инсталим провайдера, делаем пару кликов, весь траф через наш провайдер прошел.. Делаем унистал, делаем клик и провайдер сразу же выгружается.
Хотя бывает, что если долго работать, она уже просто так не выгружается. Скорее всего, потому что остается открытый сокет, на прослушку например.
W>>А если все сокеты самому закрыть, вызов произойдет сразу же или же опять ждать ?
TC>А как Вы собираетесь самостоятельно закрыть сокеты?
TC>Вы себя утопией тешите. Корректно выгрузить LSP фильтр на лету не получится. Я вообще сомневаюсь, что получится выгрузить не дожидаясь остановки приложения.
Ну уже немного получилось:
LPWSPPROC_TABLE lpMyProcTable = NULL, lpNextProcTable = NULL;
int WSPAPI
WSPStartup(
WORD wVersion,
LPWSPDATA lpWSPData,
LPWSAPROTOCOL_INFOW lpProtocolInfo,
WSPUPCALLTABLE UpCallTable,
LPWSPPROC_TABLE lpProcTable
)
{
// ..........
lpNextProcTable = &loadProvider->NextProcTable;
lpMyProcTable = lpProcTable;
// ..........
}
case DLL_PROCESS_DETACH:
gDetached = TRUE;
EnterCriticalSection( &gCriticalSection );
if ( NULL != gLayerInfo ) {
int Error;
FreeLspProviders( gLayerInfo, gLayerCount, &Error );
gLayerInfo = NULL;
gLayerCount = 0;
*lpMyProcTable = *lpNextProcTable;
}
программа уже не валится. и продолжает работать хорошо. только в случае, если идет работа с сокетами и одновременно выгрузка, проблемы начинаются ессно. Думаю теперь как лучше сделать ? Дергать мьютекс в каждой функции и потом ожидать освобождение его в потоке выгрузки ?
з.ы. я знаю, как это выглядит, но не судите строго, таково ТЗ проекта и нужно очень постараться это сделать..