|
Вопрос # 1 131/ вопрос открыт / |
|
Ранее я задавал вопрос № 1121, проблема с статической загрузкой DLL.
В виду "скудности описания ошибки", эта самая ошибка осталась не решенной.
В программе DLL вызывается дважды, во время первого вызова программа получает имя файла DLL, метод кодирования, и его краткое описание,
во второй раз производится вызов DLL по этим параметрам.
Приложение: Переключить в обычный режим-
-
-
-
- procedure xorcod(pth,epth: pchar); stdcall;
- var f1,f2:file of char;
- ch: char;
- begin
- assignfile(f1,strpas(pth));
- assignfile(f2,strpas(epth));
- reset(f1);
- rewrite(f2);
- while not eof(f1) do
- begin
- read(f1,ch);
- ch:=chr(ord(ch) xor 123);
- write(f2, ch)
- end;
- closefile(f1);
- closefile(f2);
- end;
- exports fident index 0, mident index 1, xorcod index 2;
-
-
- procedure TcodForm.Button3Click(Sender: TObject);
- type tproc = procedure(pth,epth: pchar);
- var
- proc: tproc;
- dll: thandle;
- begin
- try
-
-
-
- finally
- FreeLibrary(DLL);
- end;
- end;
 |
Вопрос задал: 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 в раздел "Используемые материалы" моей курсовой.
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|