Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.07.28;
Скачать: CL | DM;

Вниз

В ProcessExplorer видно,что DLL загружена 2 раза   Найти похожие ветки 

 
Pit   (2013-03-04 12:13) [0]

При просмотре процесса видно, что одна и та же DLL (путь одинаков) загружена 2 раза. Так бывает?
А у меня соответственно отладка не работает в этой DLL...


 
брат Птибурдукова   (2013-03-04 12:16) [1]

Так бывает.


 
Pit   (2013-03-04 12:25) [2]

а почему так происходит? По идее винда должна понять что грузить одно и тоже два раза бессмысленно и просто увеличить количество ссылок, отправить библиотеке уведомление об аттаче и все такое.. но зачем грузить 2 раза в ВАП процесса?


 
sniknik ©   (2013-03-04 13:08) [3]

dll hell в действии?


 
Игорь Шевченко ©   (2013-03-04 13:15) [4]

procmon рулит


 
O'ShinW ©   (2013-03-04 13:18) [5]

Интересно, причем и "стандартные" программы (IE) так делают
http://www.fotolink.su/v.php?id=e6fef4e8acbe0be3bfed5075c4481e78

а если самому писать
var
 H1, H2: THandle;
begin
 H1 := LoadLibrary("C:\delphi_Work\dllSMS\SMS_RTK.dll");
 H2 := LoadLibrary("C:\delphi_Work\dllSMS\SMS_RTK.dll");
 ShowMessageFmt(" %d %d ",[H1, H2]);
то один


 
Pit   (2013-03-04 13:45) [6]


> dll hell в действии?

причем тут dll hell?


> procmon рулит

не понял смысла поста


>  причем и "стандартные" программы (IE) так делают

а вот ПОЧЕМУ так происходит?

Ведь действительно, если сделать два раза LoadLibrary - то винда не загрузит библиотеку два раза... Как же в некоторых процессах так выходит?


 
Игорь Шевченко ©   (2013-03-04 13:47) [7]


> не понял смысла поста


http://lmgtfy.com/?q=procmon


 
bems ©   (2013-03-04 13:52) [8]

кажется такое бывает при использовании флажка LOAD_LIBRARY_AS_DATAFILE, или как-то так


 
Pit   (2013-03-04 13:55) [9]


> http://lmgtfy.com/?q=procmon

нахрен мне нужна ссылка на procmon.

Я не понимаю каким образом вопрос о двойной загрузке dll связан с какой-то программой.

Этап размышлений - описываю третий раз. Стандартный способ загрузить DLL - это вроде как LoadLibrary. Но если сделать два раза над одной DLL, то она не будет загружена два раза в ВАП процесса. И это логично, именно так и описывается у того же Рихтера (вроде бы) как это всё работает. А тут я вижу двойную загрузку... Почему так может происходить?


 
брат Птибурдукова   (2013-03-04 13:56) [10]


> bems ©   (04.03.13 13:52) [8]
В моём случае именно так


 
sniknik ©   (2013-03-04 13:59) [11]

> причем тут dll hell?
при том, что если правда про 2ю загрузку то это именно оно.

> Я не понимаю каким образом вопрос о двойной загрузке dll связан с какой-то программой.
таким, что загрузка, и отображение могут различаться, нужно "правильные" инструменты использовать.

> А тут я вижу двойную загрузку... Почему так может происходить?
мираж?


 
Игорь Шевченко ©   (2013-03-04 14:03) [12]


> Я не понимаю каким образом вопрос о двойной загрузке dll
> связан с какой-то программой.


программа, которая тебе нахрена, показывает, кто, как, когда с какими опциями загружает DLL в адресное пространство процесса.
Впрочем, если тебе интересна не причина, а трындеж - ну продолжай трындеть


 
Inovet ©   (2013-03-04 14:34) [13]

Подумалл. Не могут ли пути быть внешне одинаковыми, а реально разные? Похоже на что-то неправильное, но мало ли что там в Виндоус сделано для совместимости с кучей копий ДЛЛ в разных папках и подменой путей.


 
robt   (2013-03-04 14:39) [14]

для начала надо знать что именно показывает ProcessExplorer :)
например в [5] показан ие порожденный другим ие
а потом уже спорить


 
брат Птибурдукова   (2013-03-04 14:49) [15]


> Inovet ©   (04.03.13 14:34) [13]
Да можно при желании... Но — не объясняй злым умыслом то, что можно объяснить глупостью ;-)


 
Pit   (2013-03-04 15:34) [16]


> при том, что если правда про 2ю загрузку

правда. тут уже продемонстрировали скриншот, например, из IE


> то это именно оно.

причем тут dll hell?! Это ведь конфликт ВЕРСИЙ. А тут одна и та же DLL, которая лежит по ОДНОМУ ПУТИ (не две версии одной dll с разными путями) грузится два раза в память


> таким, что загрузка, и отображение могут различаться

ты хочешь сказать, что PE неверно определяет путь модуля, который загружен в ВАП процесса?


> программа, которая тебе нахрена, показывает, кто, как, когда
> с какими опциями загружает DLL

Игорь, я должен был сам об этом догадаться? Я бы тогда не задавал вопрос.
Если вы не умеете отвечать без обильного изливания желчи попутно - не пишите просто, пожалуйста, и всё.


 
Pit   (2013-03-04 15:56) [17]

воспользовался procmon.
Настроил фильтр по Process Name и Path, чтобы содержала нужную мне DLL.

Так вот в выводе procmon (запущен под админом) я вижу два раза вызов LoadImage, но в описании одинаковый адрес загрузки: Image Base: 0x40e0000

Больше похожих событий не видно. Есть различные: IRP_MJ_CREATE / IRP_MJ_CLOSE / IRP_MJ_CLEANUP / FASTIO_NETWORK_QUERY_OPEN / IRP_MJ_READ / FASTIO_QUERY_INFORMATION

В process explorer же я вижу 2 загруженные DLL, притом у одной Load Address: 0x40E0000
А у второй: 0x48C0000


 
sniknik ©   (2013-03-04 16:03) [18]

> ты хочешь сказать, что PE неверно определяет путь модуля, который загружен в ВАП процесса?
нет, я хочу сказать, что не верна твоя интерпретация увиденного... ну вот например -> robt   (04.03.13 14:39) [14]


 
Pit   (2013-03-04 16:09) [19]


> нет, я хочу сказать, что не верна твоя интерпретация увиденного.
> .

ну может быть.

Я поэтому и задаю вопрос - как это можно объяснить?


 
Игорь Шевченко ©   (2013-03-04 16:12) [20]

Pit   (04.03.13 15:56) [17]

Там много полезной информации выдается, и стек вызовов в момент загрузки


 
Pit   (2013-03-04 17:08) [21]


> Там много полезной информации выдается

не сомневаюсь. Настолько много, что ориентироваться в ней не могу. Я сделал фильтрацию как описал в [17].

Вижу только 2 вызова LoadImage и там, видимо, была загружена DLL, но по одному адресу (то есть, это не двойная загрузка).

А в PE вижу именно две DLL с разными base address.


 
Игорь Шевченко ©   (2013-03-04 17:18) [22]

А в PE вижу именно две DLL с разными base address.

в PE есть две колонки - заказанный адрес и реальный.


 
Игорь Шевченко ©   (2013-03-04 17:24) [23]

Собственно, код элементарный

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 LoadLibrary("foobar.dll");
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 LoadLibraryEx("Foobar.dll", 0, LOAD_LIBRARY_AS_DATAFILE);
end;

end.


в PE две DLL, у них разный Base и разный Image Base, для DataFile - 0


 
Pit   (2013-03-04 17:42) [24]

ну да, судя по всему bems в [8] был прав. Там у одной DLL стоит Mapping Type: Data и размер маленький.

Только вот в исходниках вызывающего процесса нет никакого LOAD_LIBRARY_AS_DATAFILE. И в исходниках DLL тоже...

Есть мысль, что это связано с COM технологией.



Страницы: 1 вся ветка

Текущий архив: 2013.07.28;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.009 c
15-1362398967
Kerk
2013-03-04 16:09
2013.07.28
Обход графа


2-1354379243
Аскалот
2012-12-01 20:27
2013.07.28
Неопознанная ошибка


15-1362601803
Юрий
2013-03-07 00:30
2013.07.28
С днем рождения ! 7 марта 2013 четверг


15-1362488545
fpc_user
2013-03-05 17:02
2013.07.28
Существует ли современная безплатная Delphi ?


15-1362342603
Юрий
2013-03-04 00:30
2013.07.28
С днем рождения ! 4 марта 2013 понедельник