как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 08:39
Оценка:
необходимо загрузить dll одним процессом
т.е. чтоб работало ЭТО

HINSTANCE h1 = LoadLibrary("1.dll");
HINSTANCE h2 = LoadLibrary("1.dll");
ASSERT(h1==h2);


разные пользователи или копию dll не предлогать
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re: как загрузить DLL одним процессом?
От: sercher Украина  
Дата: 09.06.03 08:48
Оценка:
СГ>
СГ>HINSTANCE h1 = LoadLibrary("1.dll");
СГ>HINSTANCE h2 = LoadLibrary("1.dll");
СГ>ASSERT(h1==h2);
СГ>


А в чём проблема? Нельзя чтоб хэндлы были одинаковые? Тогда линкуй статически.
Re: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 08:48
Оценка:
Здравствуйте, Сергей Глазунов, Вы писали:

СГ>необходимо загрузить dll одним процессом

СГ>т.е. чтоб работало ЭТО

СГ>
СГ>HINSTANCE h1 = LoadLibrary("1.dll");
СГ>HINSTANCE h2 = LoadLibrary("1.dll");
СГ>ASSERT(h1!=h2); // сорри.. ;)
СГ>


СГ>разные пользователи или копию dll не предлогать
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[2]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 08:50
Оценка:
Здравствуйте, sercher, Вы писали:



СГ>
СГ>HINSTANCE h1 = LoadLibrary("1.dll");
СГ>HINSTANCE h2 = LoadLibrary("1.dll");
СГ>ASSERT(h1!=h2);
СГ>


S> А в чём проблема? Нельзя чтоб хэндлы были одинаковые? Тогда линкуй статически.


статически нельзя (процесс ничего не знает о существовании dll) в том-то и проблема — нужно динамически
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[2]: как загрузить DLL одним процессом?
От: sercher Украина  
Дата: 09.06.03 08:52
Оценка:
Попробуй LoadLibraryEx() с разными флагами.
Re: как загрузить DLL одним процессом?
От: Vamp Россия  
Дата: 09.06.03 08:56
Оценка:
А зачем? Уверен, что проблема решается более ...гм... стандарными средствами.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 08:58
Оценка:
Здравствуйте, Vamp, Вы писали:

V>А зачем? Уверен, что проблема решается более ...гм... стандарными средствами.


какими?
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[3]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 09:08
Оценка:
Здравствуйте, sercher, Вы писали:



S>Попробуй LoadLibraryEx() с разными флагами.


Они безполезны и касаются другого...
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[3]: как загрузить DLL одним процессом?
От: SWW Россия  
Дата: 09.06.03 09:45
Оценка:
Здравствуйте, Сергей Глазунов, Вы писали:

СГ>Здравствуйте, Vamp, Вы писали:


V>>А зачем? Уверен, что проблема решается более ...гм... стандарными средствами.


СГ>какими?


Сначала опиши проблему. Зачем тебе нужно непременно h1==h2?
Re[3]: как загрузить DLL одним процессом?
От: sercher Украина  
Дата: 09.06.03 09:46
Оценка:
  HANDLE h1,h2;
 
  h1 = LoadLibraryEx("c:\\winnt\\system32\\ddraw.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
  h2 = LoadLibraryEx("c:\\winnt\\system32\\ddraw.dll", NULL, 0);


Чем не устраивает?
Re: как загрузить DLL одним процессом?
От: Аноним  
Дата: 09.06.03 10:39
Оценка:
Здравствуйте, Сергей Глазунов, Вы писали:

[skip]

Я считаю — что этот вопрос надо поместить в раздел — как задать вопрос — что-бы на него нельзя было ответить .

Когда уж начятся задавать нормально вопросы — а не в духе M$ — "Не стоит — поставьте !!!" (а что, где, куда и когда) сами придумывайте и ведь народ начинает отвечать ставить, рекомендовать ....
Re[3]: как загрузить DLL одним процессом?
От: Vamp Россия  
Дата: 09.06.03 10:41
Оценка:
Здравствуйте, Сергей Глазунов, Вы писали:

СГ>какими?

Так задача-тио какая? Зачем загружать DLL два раза?
Да здравствует мыло душистое и веревка пушистая.
Re[2]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 10:51
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Я считаю — что этот вопрос надо поместить в раздел — как задать вопрос — что-бы на него нельзя было ответить .


А>Когда уж начятся задавать нормально вопросы — а не в духе M$ — "Не стоит — поставьте !!!" (а что, где, куда и когда) сами придумывайте и ведь народ начинает отвечать ставить, рекомендовать ....


а я думаю, что флейм раздувать здесь ни к чему...

вопрос был нормально задан "нужно обеспечить работу кода"
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[4]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 10:51
Оценка:
Здравствуйте, SWW, Вы писали:

SWW>Здравствуйте, Сергей Глазунов, Вы писали:


СГ>Здравствуйте, Vamp, Вы писали:


V>>А зачем? Уверен, что проблема решается более ...гм... стандарными средствами.


СГ>какими?


SWW>Сначала опиши проблему. Зачем тебе нужно непременно h1==h2?


У меня имеется процесс, который загружает dll (любые), процесс может загрузить несколько раз одну и ту же dll (более чем два раза(!), здесь не работает случай с употреблением флага LOAD_LIBRARY_AS_DATAFILE).

Вопрос есть ли какие-то флаги котрые в dll, процессе еще что-нибудь, чтобы ниже код работал(!)

//где-то const int nNum = 4;
HINSTANCE h[nNum];

for(int i = 0 ; i < nNum ; i++ ){
h[i] = LoadLibrary("1.dll");
}

for( i = 0 ; i < nNum ; i++ ){
for(int j = i+1 ; j < nNum ; j++ )
ASSERT( TRUE == (h[j] != h[i]) ); // должны быть разными!
}

вопрос не в проектировании...
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[4]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 10:55
Оценка:
Здравствуйте, sercher, Вы писали:



S>
S>  HANDLE h1,h2;
 
S>  h1 = LoadLibraryEx("c:\\winnt\\system32\\ddraw.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
S>  h2 = LoadLibraryEx("c:\\winnt\\system32\\ddraw.dll", NULL, 0);
S>


S> Чем не устраивает?

спасибо за ответ, но... это работает для 2-х, а для, скажем 4-х?

Я попробую немного описать проблему:

У меня имеется процесс, который загружает dll (любые), процесс может загрузить несколько раз одну и ту же dll (более чем два раза(!), здесь не работает случай с употреблением флага LOAD_LIBRARY_AS_DATAFILE).

Вопрос: есть ли какие-то флаги котрые в dll, процессе еще что-нибудь, чтобы ниже код работал(!)

//где-то const int nNum = 4;
HINSTANCE h[nNum];

for(int i = 0 ; i < nNum ; i++ ){
h[i] = LoadLibrary("1.dll");
}

for( i = 0 ; i < nNum ; i++ ){
  for(int j = i+1 ; j < nNum ; j++ )
    ASSERT( TRUE == (h[j] != h[i]) ); // должны быть разными!
}


вопрос не в проектировании...
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[4]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 10:59
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Здравствуйте, Сергей Глазунов, Вы писали:


СГ>какими?

V>Так задача-тио какая? Зачем загружать DLL два раза?

MDI приложение загружает несколько раз dll... Возникает проблема со статическими данными в dll.

DLL писалась не мной, модифицироваться мной не может, но должна работать как???
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[5]: как загрузить DLL одним процессом?
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 09.06.03 11:05
Оценка:
Здравствуйте, Сергей Глазунов, Вы писали:

[]

Одна и таже DLL не может присутствовать в адресном пространстве процесса более чем один раз. Но

Note that two DLLs that have the same base file name and extension but are found in different directories are not considered to be the same DLL.

Re[3]: как загрузить DLL одним процессом?
От: sercher Украина  
Дата: 09.06.03 11:05
Оценка:
Не понял, так вызывай хоть 5 раз с параметром LOAD_LIBRARY_AS_DATAFILE, хэндл будет каждый раз разным.
Re[5]: как загрузить DLL одним процессом?
От: Vamp Россия  
Дата: 09.06.03 11:06
Оценка:
А зачем загружать одну и ту же DLL два раза? Вот чего я никак не могу понять.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 11:15
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Здравствуйте, Сергей Глазунов, Вы писали:


AS>[]


AS>Одна и таже DLL не может присутствовать в адресном пространстве процесса более чем один раз. Но

AS>

AS>Note that two DLLs that have the same base file name and extension but are found in different directories are not considered to be the same DLL.


спасибо, thanks
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[6]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 11:15
Оценка:
Здравствуйте, Vamp, Вы писали:

V>А зачем загружать одну и ту же DLL два раза? Вот чего я никак не могу понять.


Хорошо, проблему Вы мою поняли? Другой вариант, как обойти ошибку со статическими переменными в библиотеке(исходный код мне не известен)?
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[4]: как загрузить DLL одним процессом?
От: Sergey Россия  
Дата: 09.06.03 11:17
Оценка:
Здравствуйте, sercher, Вы писали:

S>Не понял, так вызывай хоть 5 раз с параметром LOAD_LIBRARY_AS_DATAFILE, хэндл будет каждый раз разным.


Импорты не привяжутся, точка входа не вызовется == работать эта Dll не будет.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 11:20
Оценка:
Здравствуйте, sercher, Вы писали:



S>Не понял, так вызывай хоть 5 раз с параметром LOAD_LIBRARY_AS_DATAFILE, хэндл будет каждый раз разным.


нет, не разным

    HINSTANCE h[5];
 
    for(int i = 0 ; i < 5 ; i++)
        h[i] = LoadLibraryEx("ddraw.dll", NULL, i%2 ? 0 : LOAD_LIBRARY_AS_DATAFILE);
    
    for(i = 0; i < 5 ; i++){
        cout << h[i] << endl;
    }


вывод
00900001
73720000
73720000
73720000
73720000
Press any key to continue
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[3]: как загрузить DLL одним процессом?
От: Аноним  
Дата: 09.06.03 11:31
Оценка:
Здравствуйте, Сергей Глазунов, Вы писали:

СГ>Здравствуйте, <Аноним>, Вы писали:


А>>Я считаю — что этот вопрос надо поместить в раздел — как задать вопрос — что-бы на него нельзя было ответить .


А>>Когда уж начятся задавать нормально вопросы — а не в духе M$ — "Не стоит — поставьте !!!" (а что, где, куда и когда) сами придумывайте и ведь народ начинает отвечать ставить, рекомендовать ....


СГ>а я думаю, что флейм раздувать здесь ни к чему...


СГ>вопрос был нормально задан "нужно обеспечить работу кода"


Если имя одинаковое — ничего не выйдет или самому писать загрузчик.

(Но намек был зделан — на то что есть уверенность что — то "ЧТО ВЫ ХОТИТЕ" можно реализовать по другому меньшей кровью, но раз это такая тайна — то будем разводить флем — типа
+ зделай так
+ не работает
+ здаелай так
+ не работает
+ .......
+ ОЙ (в i — итерации) а так все просто оказалось )

Без обид
Re[4]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 11:51
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Если имя одинаковое — ничего не выйдет или самому писать загрузчик.


А>Без обид


Да ну что вы...

//myprocess.h
void ChildFrame::load(string name){
  //Загрузить dll
  if(/*dll ранее не была загружена другим окном в MDI?*/)    
    m_hLib = LoadLibrary( name );
  //получить указатели всех функций
  //допустим(!) так
  for( int i = 0 ; pfn[i] ; ++i ){
    pfn[i] = GetProcAddress(m_hLib, MAKEINTRESOURCE(i));
  }
}

//допустим, есть функция вызова
void ChildFrame::load fun1(){
  pfn[i](); // <-- возникает ошибка, из-за статических переменных в dll
    // сразу оговорюсь, не из-за параметров
}


ну вот и все... Вопрос старый, как мне "обмануть" статику в dll?
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[5]: как загрузить DLL одним процессом?
От: sercher Украина  
Дата: 09.06.03 11:58
Оценка:
Нет, если всё время делать флаг LOAD_LIBRARY_AS_DATAFILE, то хэндлы будут разные, а если хоть один раз загрузить без этого, то остальные будут возвращать этот хэндл. Но проблема, что нельзя будет импортировать функции из этой dll. Так что систему не обманешь.
Re[7]: как загрузить DLL одним процессом?
От: Vamp Россия  
Дата: 09.06.03 12:04
Оценка: :)
Я правильно понял, что вы хотите иметь несколько экзмепляров статических переменных? То есть функции f1() и f2() хотя и являются реально адресами одних и те же точек входа, должны работать со своим набором статических переменных? ()Вы хотите иметь несколько экземпляров статических переменных что ли?

Если так, то могу предложить делать копию DLL каждый раз при попытке ее загрузить и загружать копию. Соответственно, в конце работы копии удалять.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: как загрузить DLL одним процессом?
От: vbond  
Дата: 09.06.03 12:15
Оценка:
Здравствуйте, sercher, Вы писали:



S> Нет, если всё время делать флаг LOAD_LIBRARY_AS_DATAFILE, то хэндлы будут разные, а если хоть один раз загрузить без этого, то остальные будут возвращать этот хэндл. Но проблема, что нельзя будет импортировать функции из этой dll. Так что систему не обманешь.


Вроде уже был не плохой совет: перед использованием библиотеки ее копировать с новым именем (случайное, неповторяющееся), а после закрытия удалять эту копию.
Re[6]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 12:18
Оценка:
Здравствуйте, sercher, Вы писали:



S> Нет, если всё время делать флаг LOAD_LIBRARY_AS_DATAFILE, то хэндлы будут разные, а если хоть один раз загрузить без этого, то остальные будут возвращать этот хэндл. Но проблема, что нельзя будет импортировать функции из этой dll. Так что систему не обманешь.


Я уже у Дж.Рихтера прочел, для чего нужен этот флаг, здесь он не применим...
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[7]: как загрузить DLL одним процессом?
От: sercher Украина  
Дата: 09.06.03 12:24
Оценка:
Короче, вот 3 варианта:

1) Использовать временные копии Dll.
2) Загружать библиотеку в разных процессах.
3) Писать свой загрузчик Dll.
4) Меня дополнят
Re[8]: как загрузить DLL одним процессом?
От: Сергей Глазунов Украина  
Дата: 09.06.03 12:35
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Я правильно понял, что вы хотите иметь несколько экзмепляров статических переменных? То есть функции f1() и f2() хотя и являются реально адресами одних и те же точек входа, должны работать со своим набором статических переменных? ()Вы хотите иметь несколько экземпляров статических переменных что ли?


V>Если так, то могу предложить делать копию DLL каждый раз при попытке ее загрузить и загружать копию. Соответственно, в конце работы копии удалять.


Спасибо...
Хе-хе ... четыре поста я вам объяснял, на пятый — вы мне ответили, о чем я предупреждал
Автор: Сергей Глазунов
Дата: 09.06.03
...
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re[9]: как загрузить DLL одним процессом?
От: Vamp Россия  
Дата: 09.06.03 13:12
Оценка:
Сорри — пока выяснял, уже успел забыть.

Тогда следующий вопрос — а почему? Я почему так дотошно спрашиваю — иногда проще почесать ухо рукой, чем выяснять, как именно сделать это большим пальцем левой ноги .

СГ>Хе-хе ... четыре поста я вам объяснял, на пятый — вы мне ответили, о чем я

предупреждал
Автор: Сергей Глазунов
Дата: 09.06.03
...
Да здравствует мыло душистое и веревка пушистая.
Re[8]: как загрузить DLL одним процессом?
От: vasketsov Россия http://ntprog.by.ru
Дата: 09.06.03 15:45
Оценка:
Здравствуйте, sercher, Вы писали:

1) Можно попробовать справиться указанием для статических кусков памяти атрибута "Копирование при записи". Если четко идентифицировать, какая и где выделяется память — это несложно.

2) На reactos.com есть рабочий код загрузчика для NT (в архиве в ldr). Собственно, и первый совет тоже для NT. Но даже написание загрузчика не гарантирует успех, ибо кто и когда вызовет GetProcAddress — неизвестно, в том числе и из используемой библиотеки, а работа LdrLoadDll (которую она использует) основана на том, что одна и та же библиотека не загружена дважды.

3) Сделать COM-сервер (OUT) и запускать его при каждой необходимости. Ежели с умом — может оказаться самым простым вариантом.
Васкецов Сергей
http://registry.km.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.