проблемы с Dll .
Создал DLL, в ней есть ф-ия DLLMain,
BOOL APIENTRY DllMain(HANDLE hInst, DWORD ul_reason_being_called, LPVOID lpReserved)
{
char str[20];
sprintf(str, "%d", ++g_qwe);
MessageBox(0,str,"",0);
if(ul_reason_being_called == DLL_PROCESS_ATTACH) MessageBox(0,"DLL_PROCESS_ATTACH",0,0);
if(ul_reason_being_called == DLL_THREAD_ATTACH) MessageBox(0,"DLL_THREAD_ATTACH",0,0);
if(ul_reason_being_called == DLL_THREAD_DETACH) MessageBox(0,"DLL_THREAD_DETACH",0,0);
if(ul_reason_being_called == DLL_PROCESS_DETACH) MessageBox(0,"DLL_PROCESS_DETACH",0,0);
return TRUE;
}
я так понимаю что, при загрузке dll первый раз она должна выполнятся с ul_reason_being_called = DLL_PROCESS_ATTACH, а если еще какое то приложение начинает использовать его, то это уже ul_reason_being_called = DLL_THREAD_ATTACH, но почемуто сколько бы я не запускал приложений выходит сообщение с DLL_PROCESS_ATTACH и g_qwe=1 всегда, как будто для каждого приложения в память загружается своя библа.
Кто знает как этим бороться?
выходит сообщение с DLL_PROCESS_ATTACH и g_qwe=1 всегда, как будто для каждого приложения в память загружается своя библа.
Так оно и есть.
Для каждого приложения в память загружается своя копия библиотеки (в NT) или "делается вид", что загружается своя копия библиотеки (в W9x).
Ты, видимо, путаешь понятия процесс (PROCESS) и поток процесса (THREAD).
Так оно и есть.
Для каждого приложения в память загружается своя копия библиотеки (в NT) или "делается вид", что загружается своя копия библиотеки (в W9x).
Ты, видимо, путаешь понятия процесс (PROCESS) и поток процесса (THREAD).
!?!?!?
У меня есть статья (Источник: http://www.codenet.ru/) Вот что в ней сказано "...В общем то, динамически компонуемые библиотеки представляют собой набор скомпилированных функций. Но у этих библиотек есть свой особенности, так например, если какие то две или более программы для Windows одновременно исполняются и используют функции, находящиеся в одной DLL, то в памяти будет постоянно находится только одна библиотека, обеспечивая тем самым экономное расходование памяти...", как объеснишь сие??
Мне нужно ...., короче объясню на примере WinSock.
Есть библа в ней массив сокетов (точно не знаю как там все устоено, это не столь важно), для каждой программе которой нужен сокет эта библа выдает уникальный сокет, т.е. с уникальным портом. Но если будет создаваться своя копия библы для каждого приложения то как будут знать эти копии библ какие порты уже используются? Вот мне нужно почти тоже самое делать, и должен вестись подсчет созданых объектов, (если по примеру, то сколько создано сокетов). Как в самом первом моем сообщении видно я использовал глобальную переменную, и при входе в DLLMain (хотя это не подсчет созданых в библе объектов, но принцип тот же), инкриментировал ее и показывал, но все время показывалось 1.
!?!?!?
У меня есть статья (Источник: http://www.codenet.ru/) Вот что в ней сказано "...В общем то, динамически компонуемые библиотеки представляют собой набор скомпилированных функций. Но у этих библиотек есть свой особенности, так например, если какие то две или более программы для Windows одновременно исполняются и используют функции, находящиеся в одной DLL, то в памяти будет постоянно находится только одна библиотека, обеспечивая тем самым экономное расходование памяти...", как объеснишь сие??
Что и как будет находиться в памяти системы не имеет значения. Рассматривай в контексте конкретного процесса. Процесс запрашивает подключение DLL, значит в контексте данного процесса сначала выполниться DllMain.
Мне нужно ...., короче объясню на примере WinSock.
Есть библа в ней массив сокетов (точно не знаю как там все устоено, это не столь важно), для каждой программе которой нужен сокет эта библа выдает уникальный сокет, т.е. с уникальным портом. Но если будет создаваться своя копия библы для каждого приложения то как будут знать эти копии библ какие порты уже используются? Вот мне нужно почти тоже самое делать, и должен вестись подсчет созданых объектов, (если по примеру, то сколько создано сокетов). Как в самом первом моем сообщении видно я использовал глобальную переменную, и при входе в DLLMain (хотя это не подсчет созданых в библе объектов, но принцип тот же), инкриментировал ее и показывал, но все время показывалось 1.
Если ты из разных процессов хочешь обращаться к единой области памяти, то либо создай Shared memory (см. CreateFileMapping), либо создай в DLL расшаренную секциб в которой объяви свои переменные:
int g_qwe = 0;
#pragma data_seg()
#pragma comment(linker, "/section:.shared,rws")
Что и как будет находиться в памяти системы не имеет значения. Рассматривай в контексте конкретного процесса. Процесс запрашивает подключение DLL, значит в контексте данного процесса сначала выполниться DllMain.
Если ты из разных процессов хочешь обращаться к единой области памяти, то либо создай Shared memory (см. CreateFileMapping), либо создай в DLL расшаренную секциб в которой объяви свои переменные:
int g_qwe = 0;
#pragma data_seg()
#pragma comment(linker, "/section:.shared,rws")
Сасибо теперь работает :)