по адресу в коде узнаём имя экзешника, Win + Lin

..а также его allocation base.
Делюсь из пыльных закромов. Разработал для самодебажащейся программы, которая сама парсила свой dwarf2
Делюсь из пыльных закромов. Разработал для самодебажащейся программы, которая сама парсила свой 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}