Як дізнатися, які бібліотеки (dll) використовує програма?
Написав прогу, на моєму комп'ютері нормально працює, приніс на комп, де дельфи немає і ніколи не стояло, пробую запустити, видає повідомлення, що вимагає такої-то бібліотека. У зв'язку з чим питання, а точніше цілих два:
1) Чи можна зробити так, щоб при компіляції весь код з таких бібліотек компілювався в основну прогу, тобто щоб ці длл-ки були не потрібні
2) Якщо немає, то як дізнатися, які бібліотеки може зажадати прога, щоб поширювати їх разом з прогой?
> Якщо немає, то як дізнатися, які бібліотеки може зажадати
> Прога, щоб поширювати їх разом з прогой?
Function GetAllProcesses2: Boolean;
Type
TEnumProcessModules = Function (hProcess: THandle; lphModule: LPDWORD; cb: DWORD; Var lpcbNeeded: DWORD): BOOL Stdcall;
TGetModuleFileNameExA = Function (hProcess: THandle; HMODULE: HMODULE; lpFileName: PAnsiChar; nSize: DWORD): DWORD Stdcall;
Var
EnumProcessModules. TEnumProcessModules;
GetModuleFileNameExA: TGetModuleFileNameExA;
hPSAPI. THandle;
Counter1. LongWord;
pbNeeded. DWORD;
ModHndls. Array [0..1023] Of DWORD;
mbNeeded. DWORD;
ModulePath. String;
Begin
Result: = False;
hPSAPI: = LoadLibrary ( "PSAPI.dll");
If hPSAPI <32 Then
# XA0; Begin
# XA0; # XA0; Result: = False;
# XA0; # XA0; Exit;
# XA0; End;
EnumProcessModules: = GetProcAddress (hPSAPI, "EnumProcessModules");
GetModuleFileNameExA: = GetProcAddress (hPSAPI, "GetModuleFileNameExA");
If EnumProcessModules (GetCurrentProcess, @ModHndls, Length (ModHndls), mbNeeded)
# XA0; Then For Counter1: = 0 To (mbNeeded Div 4) - 1 Do
# XA0; # XA0; # XA0; # XA0; Begin
# XA0; # XA0; # XA0; # XA0; # XA0; SetLength (ModulePath, MAX_PATH);
# XA0; # XA0; # XA0; # XA0; # XA0; GetModuleFileNameExA (GetCurrentProcess, ModHndls [Counter1], PChar (ModulePath), MAX_PATH);
# XA0; # XA0; # XA0; # XA0; # XA0; Form1.memo1.Lines.add (ModulePath);
# XA0; # XA0; # XA0; # XA0; end;
FreeLibrary (hPSAPI);
End;
procedure TForm1.Button1Click (Sender: TObject);
begin
# XA0; GetAllProcesses2;
end;
Спробував tdump з параметром -em, виїло список в якому - увага - НІ тієї длл, на відсутність якої лаялася вісь (dforrt.dll). Тобто метод ненадійний.
Спробую прогу від Rouse.
Запускаємо програму під середовищем, приходимо на BreakPoint, ліземо в меню View - і десь там бачимо пункт, який показує список статично завантажених DLL. А що завантажуються ручками ми і так знаємо.
Дане завдання рішення не має.
> Написав прогу, на моєму комп'ютері нормально працює, приніс
> На комп, де дельфи немає і ніколи не стояло
> НІ тієї длл, на відсутність якої лаялася вісь (dforrt.
> Dll).
ця DLL до Delphi не відноситься
Є підозра, що використовувана длл теж якісь свої длл використовує.
Так і є. tdump длл-ки показав, що вона звертається до цієї самої dforrt.dll. А ще до якоїсь MSVCRT.dll:IMPORT: # XA0; # XA0; # XA0; MSVCRT.dll =. "Malloc"
IMPORT: # XA0; # XA0; # XA0; MSVCRT.dll =. "_ Adjust_fdiv"
IMPORT: # XA0; # XA0; # XA0; MSVCRT.dll =. "_ Initterm"
IMPORT: # XA0; # XA0; # XA0; MSVCRT.dll =. "Free"
Це рідна віндовскій або теж якась ліва?
> Це рідна віндовскій або теж якась ліва?
Спорідненість з цим модулем у "вінди" того ж коліна, що і спорідненість Делфі-додатків з можулем rtlXX.bpl
Так вона рідна для вінди чи ні? Або теж з віжл студіо?
вона рідна не для вінди, а для тих її компонентів, які розроблялися з використанням MSVC (VC - це не VisualStudio, а VisualC)
Ліва - MicroSoft VC RunTime
Тобто вона є не скрізь і її теж треба включати разом з dforrt.dll в комплект з екзішніком?
Не треба.
Модуль поставляється штатно в складі дистрибутива, без нього неможлива робота величезної купи штатно поставляється в складі ОС прикладного софту.
> Це рідна віндовскій або теж якась ліва?