Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 607

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Прочитал статью на http://sources.ru/magazine/0804/delphidll.html - заинтересовало.Это код программы для просмотра функций DLL. Создал свое приложение-попробовал -код работает,но только в listBox отражаются только кубики.Знаний не хватает.Подскажите - что-то не то с кодировкой или как часто бывает - не совсем правильный код примера?

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics,
  7. Controls,
  8. Forms,
  9. Dialogs, StdCtrls;
  10.  
  11. type
  12. TForm1 = class(TForm)
  13. lb: TListBox;
  14. procedure FormCreate(Sender: TObject);
  15. private
  16. { Private declarations }
  17. cmdline : String;
  18. ImageBase : DWord;
  19. DosHeader : PImageDosHeader;
  20. PeHeader : PImageNtHeaders;
  21. PExport : PImageExportDirectory;
  22. pname : PDWord;
  23. name : PChar;
  24. public
  25. { Public declarations }
  26.  
  27. end;
  28.  
  29. var
  30. Form1: TForm1;
  31.  
  32. implementation
  33.  
  34. {$R *.dfm}
  35.  
  36. procedure TForm1.FormCreate(Sender: TObject);
  37.  
  38. procedure FatalOsError;
  39. begin
  40. ShowMessage(SysErrorMessage(GetLastError( )));
  41. Abort;
  42. end;
  43.  
  44. Var i: Integer;
  45. begin
  46. try
  47. if (ParamCount( ) < 1) then
  48. Abort
  49. else
  50. cmdline := ParamStr(1);
  51.  
  52. ImageBase := LoadLibrary(PChar(cmdline));
  53. if (ImageBase = 0) then FatalOsError;
  54.  
  55. try
  56. DosHeader := PImageDosHeader(ImageBase);
  57. if (DosHeader^.e_magic <> IMAGE_DOS_SIGNATURE) then
  58. FatalOsError;
  59.  
  60. PEHeader := PImageNtHeaders(DWord(ImageBase) +
  61. DWord(DosHeader^._lfanew));
  62. if (PEHeader^.Signature <> IMAGE_NT_SIGNATURE) then
  63. FatalOsError;
  64.  
  65. PExport := PImageExportDirectory(ImageBase +
  66. DWord(PEHeader^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY
  67. _EXPORT].VirtualAddress));
  68. pname := PDWord(ImageBase +
  69. DWord(PExport^.AddressOfNames));
  70.  
  71. For i := 0 to PExport^.NumberOfNames - 1 do begin
  72. name := PChar(PDWord(DWord(ImageBase) + PDword(pname)^));
  73. lb.Items.Add(name);
  74. inc(pname);
  75. end;
  76. finally
  77. FreeLibrary(ImageBase);
  78. end;
  79.  
  80. except
  81. Application.ShowMainForm := False;
  82. Application.Terminate;
  83. end;
  84. end;
  85.  
  86. end.


igoriy Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: igoriy (статус: Посетитель)
Вопрос отправлен: 25 сентября 2010, 07:53
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 25 сентября 2010, 16:28; участников в обсуждении: 1.

25 сентября 2010, 11:38: Вопрос перемещён из тематического раздела Delphi » Взаимодействие с Windows в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А.

igoriy

igoriy (статус: Посетитель), 25 сентября 2010, 16:28 [#1]:

Тема закрывается.Дошло.Так как работаю в 2010 то никак не могу привыкнуть к нововведениям.
Нужно делать так name := PAnsiChar(PDWord(DWord(ImageBase) + PDword(pname)^));

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.02 сек.