Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблемы с Dll .

1.9K
09 декабря 2004 года
HEvgA
49 / / 16.09.2004
Привет всем!
Создал DLL, в ней есть ф-ия DLLMain,
Код:
static int g_qwe = 0;

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 всегда, как будто для каждого приложения в память загружается своя библа.

Кто знает как этим бороться?
3
09 декабря 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by HEvgA
выходит сообщение с DLL_PROCESS_ATTACH и g_qwe=1 всегда, как будто для каждого приложения в память загружается своя библа.


Так оно и есть.
Для каждого приложения в память загружается своя копия библиотеки (в NT) или "делается вид", что загружается своя копия библиотеки (в W9x).

Ты, видимо, путаешь понятия процесс (PROCESS) и поток процесса (THREAD).

1.9K
09 декабря 2004 года
HEvgA
49 / / 16.09.2004
Цитата:
Originally posted by Green

Так оно и есть.
Для каждого приложения в память загружается своя копия библиотеки (в NT) или "делается вид", что загружается своя копия библиотеки (в W9x).

Ты, видимо, путаешь понятия процесс (PROCESS) и поток процесса (THREAD).



!?!?!?
У меня есть статья (Источник: http://www.codenet.ru/) Вот что в ней сказано "...В общем то, динамически компонуемые библиотеки представляют собой набор скомпилированных функций. Но у этих библиотек есть свой особенности, так например, если какие то две или более программы для Windows одновременно исполняются и используют функции, находящиеся в одной DLL, то в памяти будет постоянно находится только одна библиотека, обеспечивая тем самым экономное расходование памяти...", как объеснишь сие??

Мне нужно ...., короче объясню на примере WinSock.
Есть библа в ней массив сокетов (точно не знаю как там все устоено, это не столь важно), для каждой программе которой нужен сокет эта библа выдает уникальный сокет, т.е. с уникальным портом. Но если будет создаваться своя копия библы для каждого приложения то как будут знать эти копии библ какие порты уже используются? Вот мне нужно почти тоже самое делать, и должен вестись подсчет созданых объектов, (если по примеру, то сколько создано сокетов). Как в самом первом моем сообщении видно я использовал глобальную переменную, и при входе в DLLMain (хотя это не подсчет созданых в библе объектов, но принцип тот же), инкриментировал ее и показывал, но все время показывалось 1.

3
09 декабря 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by HEvgA

!?!?!?
У меня есть статья (Источник: http://www.codenet.ru/) Вот что в ней сказано "...В общем то, динамически компонуемые библиотеки представляют собой набор скомпилированных функций. Но у этих библиотек есть свой особенности, так например, если какие то две или более программы для Windows одновременно исполняются и используют функции, находящиеся в одной DLL, то в памяти будет постоянно находится только одна библиотека, обеспечивая тем самым экономное расходование памяти...", как объеснишь сие??


Что и как будет находиться в памяти системы не имеет значения. Рассматривай в контексте конкретного процесса. Процесс запрашивает подключение DLL, значит в контексте данного процесса сначала выполниться DllMain.

Цитата:
Originally posted by HEvgA

Мне нужно ...., короче объясню на примере WinSock.
Есть библа в ней массив сокетов (точно не знаю как там все устоено, это не столь важно), для каждой программе которой нужен сокет эта библа выдает уникальный сокет, т.е. с уникальным портом. Но если будет создаваться своя копия библы для каждого приложения то как будут знать эти копии библ какие порты уже используются? Вот мне нужно почти тоже самое делать, и должен вестись подсчет созданых объектов, (если по примеру, то сколько создано сокетов). Как в самом первом моем сообщении видно я использовал глобальную переменную, и при входе в DLLMain (хотя это не подсчет созданых в библе объектов, но принцип тот же), инкриментировал ее и показывал, но все время показывалось 1.


Если ты из разных процессов хочешь обращаться к единой области памяти, то либо создай Shared memory (см. CreateFileMapping), либо создай в DLL расшаренную секциб в которой объяви свои переменные:

 
Код:
#pragma data_seg(".shared")
int g_qwe = 0;
#pragma data_seg()
#pragma comment(linker, "/section:.shared,rws")
1.9K
10 декабря 2004 года
HEvgA
49 / / 16.09.2004
Цитата:
Originally posted by Green

Что и как будет находиться в памяти системы не имеет значения. Рассматривай в контексте конкретного процесса. Процесс запрашивает подключение DLL, значит в контексте данного процесса сначала выполниться DllMain.


Если ты из разных процессов хочешь обращаться к единой области памяти, то либо создай Shared memory (см. CreateFileMapping), либо создай в DLL расшаренную секциб в которой объяви свои переменные:
 
Код:
#pragma data_seg(".shared")
int g_qwe = 0;
#pragma data_seg()
#pragma comment(linker, "/section:.shared,rws")



Сасибо теперь работает :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог