Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Вниз

Динамическое подключение dll.   Найти похожие ветки 

 
bloodman ©   (2004-07-13 19:33) [0]

Мне нужно подключать dll в процессе работы программы , для этоко созда класс . в кострукторе create написал

fhande:=loadlibrary(...);
if fhandle > 32 then
@proc:=GetProcAddress(fhandle,"proc");

в деструкторе destroy написал

FreeLibrary(fhandle);
inherited;

НО!На вызове freelibrary вылезает Access Violation!
Почему??


 
Тимохов ©   (2004-07-13 19:35) [1]


> НО!На вызове freelibrary вылезает Access Violation!

потому, что процедура не найдена, а вы не проверяете результат работы GetProcAddress.

и почему > 32?


 
Reindeer Moss Eater ©   (2004-07-13 19:37) [2]

НО!На вызове freelibrary вылезает Access Violation!
Почему??


Потому что не на вызове FreeLibrary возникает Access Violation.


 
Семен Сорокин ©   (2004-07-13 19:40) [3]

может быть еще и в самой библиотеке в DllEntryPoint.


 
bloodman ©   (2004-07-13 19:44) [4]

>Тимохов ©   (13.07.04 19:35) [1]
>и почему > 32?
http://delphiworld.narod.ru/base/dynamic_use_dll.html

>потому, что процедура не найдена, а вы не проверяете результат работы GetProcAddress.
При ошибке загрузкb процедуры выгружается библиотека??


 
bloodman ©   (2004-07-13 19:46) [5]

>Семен Сорокин ©   (13.07.04 19:40) [3]
Со статической привязкой работает нормально.
Там нет 1 процедуры , которая загружается.
теперь у меня 1 вопрос:
При ошибке загрузки процедуры выгружается библиотека??


 
Reindeer Moss Eater ©   (2004-07-13 19:46) [6]

Не может быть AV при freelibrary.
Ошибка не здесь.


 
Тимохов ©   (2004-07-13 19:47) [7]


> bloodman ©   (13.07.04 19:44) [4]

сслылка не открывается - ну и ладно.
что бы там не было написано - фигня.
вот описание из msdn функции loadlibrary
Return Value
If the function succeeds, the return value is a handle to the module.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.

им и надо руководствоваться.


> При ошибке загрузкb процедуры выгружается библиотека??

нет - просто GetProcAddress не возвращает адрес.


 
bloodman ©   (2004-07-13 19:48) [8]

Reindeer Moss Eater ©   (13.07.04 19:46) [6]
Если поменять inherited c freelibrary , то ошибка появляется именно на freelibrary.


 
Reindeer Moss Eater ©   (2004-07-13 19:49) [9]

Не может быть AV при freelibrary.
Ошибка не здесь.


 
Семен Сорокин ©   (2004-07-13 19:49) [10]

bloodman ©   (13.07.04 19:46) [5]
вы используете в Dll-ке глобальные объекты? корректно ли они выгружаются? Что говорит отладка? Call Stack?


 
Гаврила ©   (2004-07-13 19:50) [11]


> Не может быть AV при freelibrary.
> Ошибка не здесь.


Может.
Просто в деструкторе проверять FHandle на 0.
Кстати, если в конструкторе не удалось загрузить библиотеку, хорошо бы сразу исключение поднять


 
Reindeer Moss Eater ©   (2004-07-13 19:50) [12]

Он деструктор вызывает у несуществующего объекта.
Не может быть AV при freelibrary.


 
bloodman ©   (2004-07-13 19:51) [13]

Семен Сорокин ©   (13.07.04 19:49) [10]
Я даже функции не использую(пока) я только класс написал , захотел проверить , вот ми проверил...


 
Тимохов ©   (2004-07-13 19:51) [14]

гадаем на кофейно гуще.
кода бы дал.


 
Reindeer Moss Eater ©   (2004-07-13 19:52) [15]

Он деструктор вызывает у несуществующего объекта.
Не может быть AV при freelibrary.


 
bloodman ©   (2004-07-13 19:53) [16]

Гаврила ©   (13.07.04 19:50) [11]

Библиоттека загружается.
Хендл не нулевой!


 
bloodman ©   (2004-07-13 19:54) [17]

type
 TInit=function(App: Integer): Boolean;
 TShowMainControls=function(hPanel: HWND;hForm: HWND): boolean;
 TFind=function(SearchString:widestring;SearchType:byte;OnlyName:boolean;Regist:boolean):TStrings;
 TUnloadLib=function: Boolean;
 TAboutPlugin=function:TPluginInfo;

type
 TPlugin = class

 private
  FFileName : String;
  FHandle   :THandle;
  FInit:TInit;
  FShowMainControls:TShowMainControls;
  FFind:TFind;
  FUnloadLib:TUnloadLib;
  FAboutPlugin:TAboutPlugin;

 public
  constructor Create( AFileName : String;var ISPlugin:boolean);
  destructor Destroy; override;

  property Handle : THandle read FHandle;
  property FileName : String read FFileName;

  function init(App: Integer): Boolean;
  function AboutPlugin:TPluginInfo;
  function ShowMainControls(hPanel: HWND;hForm: HWND):boolean;
  function Find(SearchString:widestring;SearchType:byte;OnlyName:boolean;Regist:boolean):TStrings;
  function UnloadLib:boolean;
 end;

constructor TPlugin.Create( AFileName : String;var ISPlugin:boolean);
begin
ISPlugin:=False;
if FileExists(AFileName) then
begin
 FHandle := LoadLibrary(PChar(AFileName));
 if FHandle > 32 then
 begin
  @FInit:=GetProcAddress(FHandle,PChar("InitLib"));
  @FShowMainControls:=GetProcAddress(FHandle,PChar("ShowMainControls"));
  @FFind:=GetProcAddress(FHandle,PChar("Find"));
  @FUnloadLib:=GetProcAddress(FHandle,PChar("UnloadLib"));
  @FAboutPlugin:=GetProcAddress(FHandle,PChar("AboutPlugin"));
  IF ((@FInit <> nil) and ( @FShowMainControls <> nil ) and (@FFind <> nil ) and (@FUnloadLib <> nil)) then ISPlugin:=True;
 end;
end;
end;

destructor TPlugin.Destroy;
begin
FreeLibrary(FHandle);
inherited;
end;


 
Reindeer Moss Eater ©   (2004-07-13 19:54) [18]

Еще раз повторить?


 
bloodman ©   (2004-07-13 19:55) [19]

Reindeer Moss Eater ©   (13.07.04 19:54) [18]

Где ошибка тогда?


 
Тимохов ©   (2004-07-13 19:56) [20]

библиотека ваша?

если да, то думаю, что там есть ошибка при выгрузке.


 
Reindeer Moss Eater ©   (2004-07-13 19:56) [21]

Ты деструктор вызывает у несуществующего объекта.
Не может быть AV при freelibrary.

Ошибка - вне описания и реализации класса.


 
Семен Сорокин ©   (2004-07-13 19:57) [22]

TInit=function(App: Integer): Boolean of object;
TShowMainControls=function(hPanel: HWND;hForm: HWND): boolean of object;
TFind=function(SearchString:widestring;SearchType:byte;OnlyName:boolean;Regist:boolean):TStrings of object;
TUnloadLib=function: Boolean of object;
TAboutPlugin=function:TPluginInfo of object;


 
Тимохов ©   (2004-07-13 19:58) [23]


> Семен Сорокин ©   (13.07.04 19:57) [22]

это то зачем?


 
bloodman ©   (2004-07-13 19:59) [24]

Тимохов ©   (13.07.04 19:56) [20]

Я ведь не запускаю ни одной процедуры из этой dll.Притом при статической привязке все работает.


 
Reindeer Moss Eater ©   (2004-07-13 20:00) [25]

Убери нафик свой класс.

Загрузи и выгрузи библиотеку.
Если будет AV значит [20]
Если не будет, значит [21]


 
Семен Сорокин ©   (2004-07-13 20:07) [26]


> Тимохов ©   (13.07.04 19:58) [23]
> это то зачем?

действительно а зачем :)
запутали изверги, пора домой.

bloodman ©   (13.07.04 19:59) [24]

см. [25]


 
bloodman ©   (2004-07-13 20:08) [27]

Почему тогда при статической привязке все работает????


 
bloodman ©   (2004-07-13 20:10) [28]

Сделал так:
FindFirst(ExtractFilePath(Application.ExeName)+"Plug-ins\*.dll",faAnyFile,Search);
 FHandle := LoadLibrary(PChar(ExtractFilePath(Application.ExeName)+"Plug-ins\"+Search.Name));
if FHandle > 32 then
 begin
  @FInit:=GetProcAddress(FHandle,PChar("InitLib"));
  @FShowMainControls:=GetProcAddress(FHandle,PChar("ShowMainControls"));
//  @FFind:=GetProcAddress(FHandle,PChar("Find"));
  @FUnloadLib:=GetProcAddress(FHandle,PChar("UnloadLib"));
  @FAboutPlugin:=GetProcAddress(FHandle,PChar("AboutPlugin"));
 end;
FreeLibrary(FHandle);
Появилось AV.

Может ли это быть потому что данный код написан в FormCreate?


 
Семен Сорокин ©   (2004-07-13 20:13) [29]

bloodman ©   (13.07.04 20:10) [28]
на последок что есть TPluginInfo?
ShareMem используется, читали предупреждение в начале библиотеки?


 
bloodman ©   (2004-07-13 20:15) [30]

вот весь dll

unit panel;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes,
 Graphics, Controls, Forms,  Dialogs, StdCtrls,
 jpeg, ExtCtrls, ComCtrls, glTView,Menus,fcShapeBtn;

type
 TfmDLL = class(TForm)
   pnDll: TPanel;
   glTreeView1: TglTreeView;
   ListBox1: TListBox;
   Image1: TImage;
   Memo1: TMemo;
   PopupMenu1: TPopupMenu;
   adas1: TMenuItem;
   fd1: TMenuItem;
   Panel1: TPanel;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

type
TPluginInfo = record
   Name :  WideString;
   About:  WideString;
   Author: WideString;
   EMail:  WideString;
   Url   : WideString;
 end;

function InitLib(App: Integer): Boolean; register; exports InitLib;
function ShowMainControls(hPanel: HWND;hForm: HWND):boolean; register; exports ShowMainControls;
function UnloadLib(): Boolean; register; exports UnloadLib;
function AboutPlugin():TPluginInfo; register; exports AboutPlugin;
var
 fmDLL: TfmDLL;
 DLLApp: TApplication;

implementation

{$R *.dfm}

function InitLib(App: Integer): Boolean;
begin
DLLApp      :=Application;
Application :=TApplication(App);
Application.CreateForm(TfmDLL, fmDLL);
result:=true;
end;

function AboutPlugin():TPluginInfo;
var
about : TPluginInfo;
begin
about.Name:="dff";
about.About:="lalal";
about.Author:="nini";
about.EMail:="lala@lala.ru";
about.Url:="http://adfd.ru";
result:=about;
end;

function ShowMainControls(hPanel: HWND;hform : HWND): boolean;
begin
fmDLL.pnDLL.Parent:=nil;
fmDLL.pnDLL.ParentWindow:=hform;
fmDLL.Memo1.Parent:=nil;
fmDLL.ListBox1.Parent:=nil;
fmDLL.glTreeView1.Parent:=nil;
fmDLL.Memo1.ParentWindow:=hPanel;
fmDLL.ListBox1.ParentWindow:=hPanel;
fmDLL.glTreeView1.ParentWindow:=hPanel;
fmdll.Panel1.Parent:=nil;
fmdll.Panel1.ParentWindow:=hPanel;
Result:=true;
end;

function UnloadLib(): Boolean;
begin
fmDLL.pnDLL.Parent:=fmDLL;
fmDLL.pnDLL.ParentWindow:=fmDLL.Handle;
fmDLL.Memo1.Parent:=fmDLL.pnDll;
fmDLL.ListBox1.Parent:=fmDLL.pnDll;
fmDLL.glTreeView1.Parent:=fmDLL.pnDll;
fmDLL.Memo1.ParentWindow:=fmDLL.pnDll.Handle;
fmDLL.ListBox1.ParentWindow:=fmDLL.pnDll.Handle;
fmDLL.glTreeView1.ParentWindow:=fmDLL.pnDll.Handle;
fmdll.Panel1.Parent:=fmDLL.pnDll;
fmdll.Panel1.ParentWindow:=fmDLL.pnDll.Handle;
fmDLL.Free;
Application :=DLLApp;
Result      :=True;
end;

end.


 
bloodman ©   (2004-07-13 21:02) [31]

А ошибка то была в том что я забыл убрать ShareMem из uses dll"ки .... :))


 
Reindeer Moss Eater ©   (2004-07-14 09:02) [32]

Тебе же говорили, что FreeLibrary не может быть причиной AV.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.036 c
14-1088935805
Rouse_
2004-07-04 14:10
2004.07.25
С Днем Рождения 4 июля


14-1088951968
Vasya.ru
2004-07-04 18:39
2004.07.25
Компы не коннектятся!


1-1089574827
NailMan
2004-07-11 23:40
2004.07.25
Алгоритм форматирования текста "По ширине"


3-1088399015
Sirus
2004-06-28 09:03
2004.07.25
Передача свежих данных на сервер по модему...


8-1080585329
Mr Duda
2004-03-29 22:35
2004.07.25
Как вывести амплитуду wav? help help help





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский