Я правильно понял, что вы хотите иметь несколько экзмепляров статических переменных? То есть функции f1() и f2() хотя и являются реально адресами одних и те же точек входа, должны работать со своим набором статических переменных? ()Вы хотите иметь несколько экземпляров статических переменных что ли?
Если так, то могу предложить делать копию DLL каждый раз при попытке ее загрузить и загружать копию. Соответственно, в конце работы копии удалять.
Здравствуйте, Сергей Глазунов, Вы писали:
СГ>Здравствуйте, Vamp, Вы писали:
V>>А зачем? Уверен, что проблема решается более ...гм... стандарными средствами.
СГ>какими?
Сначала опиши проблему. Зачем тебе нужно непременно h1==h2?
Я считаю — что этот вопрос надо поместить в раздел — как задать вопрос — что-бы на него нельзя было ответить .
Когда уж начятся задавать нормально вопросы — а не в духе M$ — "Не стоит — поставьте !!!" (а что, где, куда и когда) сами придумывайте и ведь народ начинает отвечать ставить, рекомендовать ....
Здравствуйте, <Аноним>, Вы писали:
А>Я считаю — что этот вопрос надо поместить в раздел — как задать вопрос — что-бы на него нельзя было ответить .
А>Когда уж начятся задавать нормально вопросы — а не в духе M$ — "Не стоит — поставьте !!!" (а что, где, куда и когда) сами придумывайте и ведь народ начинает отвечать ставить, рекомендовать ....
а я думаю, что флейм раздувать здесь ни к чему...
вопрос был нормально задан "нужно обеспечить работу кода"
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Здравствуйте, 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... а еще я в нее ем >>
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... а еще я в нее ем >>
Здравствуйте, 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... а еще я в нее ем >>
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. Так что систему не обманешь.
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) и запускать его при каждой необходимости. Ежели с умом — может оказаться самым простым вариантом.