Делюсь из пыльных закромов. Разработал для самодебажащейся программы, которая сама парсила свой dwarf2
- Код: Выделить всё
- procedure GetModuleByAddr(addr: pointer; var baseaddr: pointer; var filename: string);
 {$ifdef unix}
 var
 dlinfo: dl_info;
 begin
 FillChar(dlinfo, sizeof(dlinfo), 0);
 dladdr(addr, @dlinfo);
 baseaddr:= dlinfo.dli_fbase;
 filename:= String(dlinfo.dli_fname);
 if ExtractFileName(filename) = ExtractFileName(ParamStr(0))
 then baseaddr:= nil;
 end;
 {$else}
 var
 Tmm: TMemoryBasicInformation;
 TST: array[0..Max_Path] of Char;
 begin
 if VirtualQuery(addr, @Tmm, SizeOf(Tmm)) <> sizeof(Tmm)
 then raise Exception.Create('The VirtualQuery() call failed.');
 baseaddr:=Tmm.AllocationBase;
 TST[0]:= #0;
 //На заметку: это не юникод. Надо бы переделать на UnicodeChar и GetModuleFileNameW
 GetModuleFileName(
 THandle(Tmm.AllocationBase), //грязный хак, который *всегда* работает
 //Фактически, винда использует allocation base в качестве хэндла.
 TST, SizeOf(TST));
 filename:= String(PChar(@TST));
 end;
 {$endif}



