Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.49 MB
Время: 0.03 c
14-1095161367
Dmitriy O.
2004-09-14 15:29
2004.10.03
Какие Вы видите перспективы С/Х на Марсе ?


1-1095455130
Evgenij
2004-09-18 01:05
2004.10.03
Модератор просто негодяй какой-то! Опять меня удалил!!!!


3-1094302756
Arnold
2004-09-04 16:59
2004.10.03
Как создать свой файл gdb


6-1090498953
diMAN
2004-07-22 16:22
2004.10.03
Многочисленные Arp-запросы


14-1095355650
lipskiy
2004-09-16 21:27
2004.10.03
Можно ли сделать так, чтобы при заходе в локальный сетевой ресурс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский