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 — итерации) а так все просто оказалось )
Здравствуйте, <Аноним>, Вы писали:
А>Если имя одинаковое — ничего не выйдет или самому писать загрузчик.
А>Без обид
Да ну что вы...
//myprocess.hvoid ChildFrame::load(string name){
//Загрузить dllif(/*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... а еще я в нее ем >>
Нет, если всё время делать флаг LOAD_LIBRARY_AS_DATAFILE, то хэндлы будут разные, а если хоть один раз загрузить без этого, то остальные будут возвращать этот хэндл. Но проблема, что нельзя будет импортировать функции из этой dll. Так что систему не обманешь.
Я правильно понял, что вы хотите иметь несколько экзмепляров статических переменных? То есть функции f1() и f2() хотя и являются реально адресами одних и те же точек входа, должны работать со своим набором статических переменных? ()Вы хотите иметь несколько экземпляров статических переменных что ли?
Если так, то могу предложить делать копию DLL каждый раз при попытке ее загрузить и загружать копию. Соответственно, в конце работы копии удалять.
S> Нет, если всё время делать флаг LOAD_LIBRARY_AS_DATAFILE, то хэндлы будут разные, а если хоть один раз загрузить без этого, то остальные будут возвращать этот хэндл. Но проблема, что нельзя будет импортировать функции из этой dll. Так что систему не обманешь.
Вроде уже был не плохой совет: перед использованием библиотеки ее копировать с новым именем (случайное, неповторяющееся), а после закрытия удалять эту копию.
S> Нет, если всё время делать флаг LOAD_LIBRARY_AS_DATAFILE, то хэндлы будут разные, а если хоть один раз загрузить без этого, то остальные будут возвращать этот хэндл. Но проблема, что нельзя будет импортировать функции из этой dll. Так что систему не обманешь.
Я уже у Дж.Рихтера прочел, для чего нужен этот флаг, здесь он не применим...
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Здравствуйте, Vamp, Вы писали:
V>Я правильно понял, что вы хотите иметь несколько экзмепляров статических переменных? То есть функции f1() и f2() хотя и являются реально адресами одних и те же точек входа, должны работать со своим набором статических переменных? ()Вы хотите иметь несколько экземпляров статических переменных что ли?
V>Если так, то могу предложить делать копию DLL каждый раз при попытке ее загрузить и загружать копию. Соответственно, в конце работы копии удалять.
Спасибо...
Хе-хе ... четыре поста я вам объяснял, на пятый — вы мне ответили, о чем я предупреждал
Тогда следующий вопрос — а почему? Я почему так дотошно спрашиваю — иногда проще почесать ухо рукой, чем выяснять, как именно сделать это большим пальцем левой ноги .
СГ>Хе-хе ... четыре поста я вам объяснял, на пятый — вы мне ответили, о чем я предупреждал
1) Можно попробовать справиться указанием для статических кусков памяти атрибута "Копирование при записи". Если четко идентифицировать, какая и где выделяется память — это несложно.
2) На reactos.com есть рабочий код загрузчика для NT (в архиве в ldr). Собственно, и первый совет тоже для NT. Но даже написание загрузчика не гарантирует успех, ибо кто и когда вызовет GetProcAddress — неизвестно, в том числе и из используемой библиотеки, а работа LdrLoadDll (которую она использует) основана на том, что одна и та же библиотека не загружена дважды.
3) Сделать COM-сервер (OUT) и запускать его при каждой необходимости. Ежели с умом — может оказаться самым простым вариантом.