Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов процедуры из собственной библиотеки. [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо