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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 1 131

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

Ранее я задавал вопрос № 1121, проблема с статической загрузкой DLL.
В виду "скудности описания ошибки", эта самая ошибка осталась не решенной.
В программе DLL вызывается дважды, во время первого вызова программа получает имя файла DLL, метод кодирования, и его краткое описание,
во второй раз производится вызов DLL по этим параметрам.

Приложение:
  1.  
  2.  
  3.  
  4.  
  5. procedure xorcod(pth,epth: pchar); stdcall;
  6. var f1,f2:file of char;
  7. ch: char;
  8. begin
  9. assignfile(f1,strpas(pth));
  10. assignfile(f2,strpas(epth));
  11. reset(f1);
  12. rewrite(f2);
  13. while not eof(f1) do
  14. begin
  15. read(f1,ch);
  16. ch:=chr(ord(ch) xor 123);
  17. write(f2, ch)
  18. end;
  19. closefile(f1);
  20. closefile(f2);
  21. end;
  22. exports fident index 0, mident index 1, xorcod index 2;
  23.  
  24.  
  25. procedure TcodForm.Button3Click(Sender: TObject);
  26. type tproc = procedure(pth,epth: pchar);
  27. var
  28. proc: tproc;
  29. dll: thandle;
  30. begin
  31. try
  32.  
  33.  
  34.  
  35. finally
  36. FreeLibrary(DLL);
  37. end;
  38. end;


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

Вопрос задал: Jake (статус: Посетитель)
Вопрос отправлен: 22 ноября 2007, 11:56
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Jake!
Итак, начинаем "разбор полётов".
Что бы устранить ошибку, достаточно поправить обявление функции

type tproc = procedure(pth,epth: pchar);stdcall;
Описание в основной программе и длл должно совпадать! Совпадать по типам, их порядку и способу вызова функции. имена параметров можно делать разными - они не сохраняются.
Теперь можно запускать - работает.

Теперь о потенциальных глюках, которые могут вылезть в дальнейшем. Правильный код динамической загрузки длл выглядит где то так
h := LoadLibrary('test.dll');
if h=0 then
  begin
    //не удалось загрузить - нет чего и выгружать
    ShowMessage('Не удалось загрузить библиотеку');
    exit;
  end;
  try
    @proc := getprocaddress(dll, PChar('xorcod'));
    if (@proc = nil) then begin
      ShowMessage('Не удалось найти функцию');
      exit;
    end;
    proc(s1, s2);
  finally
    FreeLibrary(h);
Теперь ещё об одной потенциальной проблеме.
вы используете PChar(pth.Caption). Это будет работать до тех пор, пока свойство обявленно так
private
  FCaption:string;
  procedure SetCaption(value:string);
public
  property Caption:string read FCaption write SetCaption;
как только попробуете применить этот метод к свойсву, которое обявлено как
private
  FCaption:string;
  function GetCaption:string;
  procedure SetCaption(value:string);
public
  property Caption:string read GetCaption write SetCaption;
сразу получите кучу ошибок во время исполнения. Часто скрытых, последствия которых появляться гораздо позже в самый неподходящий момент.
Хотя если вызывающая процедура модифицирует параметр, то ошибки получите ещё и в первом варианте.
Лучше использовать дополнительную переменную строкового типа.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 22 ноября 2007, 13:01
Оценка за ответ: 5

Комментарий к оценке: Все работат, спасибо. Обязательно добавлю delphi.int.ru в раздел "Используемые материалы" моей курсовой.

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

Мини-форум пуст.

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 15 декабря 2017, 03:36
Выполнено за 0.07 сек.
Рейтинг@Mail.ru