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...
Пока на собственное сообщение не было ответов, его можно удалить.