![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов процедуры из собственной библиотеки. [D7, WinXP]
Leaner © (2004-09-17 09:48:00)Помогите – запутался в трех соснах !
После вызова в программе следующей функции возникает AV.
function TestExportProc(DllName:string):Boolean;
type
TExportProc=procedure;stdcall;
var
LHand:THandle;
ExportProc:TExportProc;
begin
LHand:=LoadLibrary(PChar(DllName));
if SetResult(Result,LHand<>0) then
begin
@ExportProc:=GetProcAddress(LHand,'ExportProc');
if SetResult(Result,Assigned(@ExportProc)) then ExportProc;
FreeLibrary(LHand);
end;
end;
Вот текст вызываемой DLL:
library AuxiliaryDLL;
uses
ShareMem,
Windows,
FunctionsDLL in 'FunctionsDLL.pas';
{$R *.res}
procedure ExportProc;stdcall;
begin
MessageBox(0,'You call ExportProc procedure',PChar(MessFrom),0);
end;
procedure EntryPointProc(Reason:integer);
begin
case reason of
DLL_PROCESS_ATTACH:
begin
EntryPoint_Process_Attach;
end;
DLL_PROCESS_DETACH:
begin
EntryPoint_Process_Detach;
end;
DLL_THREAD_ATTACH:
begin
EntryPoint_Thread_Attach;
end;
DLL_THREAD_DETACH:
begin
EntryPoint_Thread_Detach;
end;
end;
end;
exports
ExportProc name 'ExportProc';
begin
DllProc:=@EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
end.
И юнит на который она ссылается:
unit FunctionsDLL;
interface
uses
Windows;
procedure EntryPoint_Process_Attach;
procedure EntryPoint_Process_Detach;
procedure EntryPoint_Thread_Attach;
procedure EntryPoint_Thread_Detach;
var
MessFrom:string;
implementation
//ParamStr(0)
procedure EntryPoint_Process_Attach;
begin
MessFrom:='Message from: '+ParamStr(0);
MessageBox(0,PChar(MessFrom),'EntryPoint_Process_Attach',0);
end;
procedure EntryPoint_Process_Detach;
begin
MessageBox(0,PChar(MessFrom),'EntryPoint_Process_Detach',0);
end;
procedure EntryPoint_Thread_Attach;
begin
MessageBox(0,PChar(MessFrom),'EntryPoint_Thread_Attach',0);
end;
procedure EntryPoint_Thread_Detach;
begin
MessageBox(0,PChar(MessFrom),'EntryPoint_Thread_Detach',0);
end;
end.
Объясните, пожалуйста, в чем дело ?
olookin (2004-09-17 18:47:00) [1][14] Leaner © (17.09.04 15:16)
Ведь я string никуда не отправлял.
А вот это да, странно. Мне как раз пришлось var string заменить на PChar, а не просто string.... Советую обратится к специалистам, тут обитающим... Заодно и мне интересно будет...
olookin (2004-09-17 18:45:00) [2][14] Leaner © (17.09.04 15:16)
Я не знаток теории. Думаю, что дело в неопределенности размера, выделяемого под string. А PChar, будучи указателем, не имеет такого дефекта....
Leaner (2004-09-17 15:16:00) [3]olookin, похоже, оказался прав.
Заменил string на PChar и заработало,
но хоть убей не понимаю почему !
Ведь я string никуда не отправлял.
TUser (2004-09-17 15:05:00) [4]Может у нас компиляторы разные? У меня седьмой. Хотя слабо верится, что в предыдущих версиях д.б. какие-то различия для этого кода. Не знаю.
Leaner (2004-09-17 14:21:00) [5]Не то что бы перенес проект, а создал новый !
На выходе все равно "Invalid pointer operator".
Но, если убрать SareMem, то "Invalid pointer operator"
исчезает, но появляется AV.
TUser (2004-09-17 12:52:00) [6]А здесь строки в dll не передаются. Скорее всего дело в том, что в проекте все-таки еще что-то есть, о чем ты забыл. Перенеси этот код в совершенно новый проект и потестируй. Он работает нормально в D7Ent, NT4.
olookin (2004-09-17 12:34:00) [7][5] Leaner © (17.09.04 10:59)
В проекте, кроме вызова TestExportProc(DllName:string); ничего нет.
Мне в почти аналогичной ситуации пришлось отказаться от string и перейти к PChar. Все заработало.
TUser (2004-09-17 11:36:00) [8]Еще раз проверил - у меня такой код работает.
Leaner (2004-09-17 11:12:00) [9]>TUser
В проекте только один вызов:
procedure TAuxiliaryForm.mnuFileClick(Sender: TObject);
begin
TestExportProc('AuxiliaryDLL.dll');
end;
TUser (2004-09-17 11:08:00) [10]
> panov © (17.09.04 10:49) [4]
Странно. Я на самом деле попробовал скомпилировать этот код - симптомы были такие, как и описал автор. Поставил SM - AV пропало и все заработало.
Invalid P Op - это где-то деление на ноль. Если действителньо ничего нет, то тогда это странно.
Leaner (2004-09-17 11:06:00) [11]>panov
Попробовал убрать FreeLibrary(LHand);
Все равно на выходе из программы "Invalid pointer operator"
Leaner (2004-09-17 10:59:00) [12]Спасибо ! AV исчезло.
Теперь все хорошо до выхода из проекта.
На выходе выдается сообщение: "Invalid pointer operator"
В проекте, кроме вызова TestExportProc(DllName:string);
ничего нет.
panov (2004-09-17 10:49:00) [13]>TUser © (17.09.04 10:36) [3]
Sharemem здесь ни при чем.
>Leaner © (17.09.04 09:48)
У тебя библиотека выгружается до того, как отработает
ExportProc
Вынеси FreeLibrary за пределы процедуры TestExportProc.
Мне так кажется.
TUser (2004-09-17 10:36:00) [14]Это лечтся прописыванеим ShareMem в коде проекта.
Leaner (2004-09-17 10:11:00) [15]
function SetResult(var Own:Boolean;Value:Boolean):Boolean;
begin
Own:=Value;
Result:=Own;
end;
После показа сообщений:
EntryPoint_Process_Attach, сообщение от ExportProc,
потом EntryPoint_Process_Detach
после этого форма на некоторое время подвисает и выдает AV
TUser (2004-09-17 10:00:00) [16]Ты скажи где (на какой строчке AV). И что такое SetResult