Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
ВнизВызов процедуры из собственной библиотеки. Найти похожие ветки
← →
Leaner © (2004-09-17 09:48) [0]Помогите – запутался в трех соснах !
После вызова в программе следующей функции возникает 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.
Объясните, пожалуйста, в чем дело ?
← →
TUser © (2004-09-17 10:00) [1]Ты скажи где (на какой строчке AV). И что такое SetResult
← →
Leaner © (2004-09-17 10:11) [2]
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:36) [3]Это лечтся прописыванеим ShareMem в коде проекта.
← →
panov © (2004-09-17 10:49) [4]>TUser © (17.09.04 10:36) [3]
Sharemem здесь ни при чем.
>Leaner © (17.09.04 09:48)
У тебя библиотека выгружается до того, как отработает
ExportProc
Вынеси FreeLibrary за пределы процедуры TestExportProc.
Мне так кажется.
← →
Leaner © (2004-09-17 10:59) [5]Спасибо ! AV исчезло.
Теперь все хорошо до выхода из проекта.
На выходе выдается сообщение: "Invalid pointer operator"
В проекте, кроме вызова TestExportProc(DllName:string);
ничего нет.
← →
Leaner © (2004-09-17 11:06) [6]>panov
Попробовал убрать FreeLibrary(LHand);
Все равно на выходе из программы "Invalid pointer operator"
← →
TUser © (2004-09-17 11:08) [7]
> panov © (17.09.04 10:49) [4]
Странно. Я на самом деле попробовал скомпилировать этот код - симптомы были такие, как и описал автор. Поставил SM - AV пропало и все заработало.
Invalid P Op - это где-то деление на ноль. Если действителньо ничего нет, то тогда это странно.
← →
Leaner © (2004-09-17 11:12) [8]>TUser
В проекте только один вызов:procedure TAuxiliaryForm.mnuFileClick(Sender: TObject);
begin
TestExportProc("AuxiliaryDLL.dll");
end;
← →
TUser © (2004-09-17 11:36) [9]Еще раз проверил - у меня такой код работает.
← →
olookin © (2004-09-17 12:34) [10][5] Leaner © (17.09.04 10:59)
В проекте, кроме вызова TestExportProc(DllName:string); ничего нет.
Мне в почти аналогичной ситуации пришлось отказаться от string и перейти к PChar. Все заработало.
← →
TUser © (2004-09-17 12:52) [11]А здесь строки в dll не передаются. Скорее всего дело в том, что в проекте все-таки еще что-то есть, о чем ты забыл. Перенеси этот код в совершенно новый проект и потестируй. Он работает нормально в D7Ent, NT4.
← →
Leaner © (2004-09-17 14:21) [12]Не то что бы перенес проект, а создал новый !
На выходе все равно "Invalid pointer operator".
Но, если убрать SareMem, то "Invalid pointer operator"
исчезает, но появляется AV.
← →
TUser © (2004-09-17 15:05) [13]Может у нас компиляторы разные? У меня седьмой. Хотя слабо верится, что в предыдущих версиях д.б. какие-то различия для этого кода. Не знаю.
← →
Leaner © (2004-09-17 15:16) [14]olookin, похоже, оказался прав.
Заменил string на PChar и заработало,
но хоть убей не понимаю почему !
Ведь я string никуда не отправлял.
← →
olookin © (2004-09-17 18:45) [15][14] Leaner © (17.09.04 15:16)
Я не знаток теории. Думаю, что дело в неопределенности размера, выделяемого под string. А PChar, будучи указателем, не имеет такого дефекта....
← →
olookin © (2004-09-17 18:47) [16][14] Leaner © (17.09.04 15:16)
Ведь я string никуда не отправлял.
А вот это да, странно. Мне как раз пришлось var string заменить на PChar, а не просто string.... Советую обратится к специалистам, тут обитающим... Заодно и мне интересно будет...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c