Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

Вызов процедуры из собственной библиотеки.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.027 c
14-1095079217
marsden
2004-09-13 16:40
2004.10.03
А как войти зарегистрированному пользователю?


4-1093250479
Adolph
2004-08-23 12:41
2004.10.03
CreateWindow


1-1095250634
bloodman
2004-09-15 16:17
2004.10.03
Как пройтись по всем компонентам на форме в рантайм.


1-1095353131
UserUserov
2004-09-16 20:45
2004.10.03
Постоянные программы


3-1094586493
sherbacov
2004-09-07 23:48
2004.10.03
протоколирование БД