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

Вниз

Динамическое подключение 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.058 c
3-1088748804
so_well
2004-07-02 10:13
2004.07.25
база и Rave Reports


3-1088721442
Daniil
2004-07-02 02:37
2004.07.25
DBGrid


1-1089603759
Belocarsk
2004-07-12 07:42
2004.07.25
TreeView+картинки ,без ImageList


1-1089290596
Stager
2004-07-08 16:43
2004.07.25
Просмотр HTML


6-1085403974
CrazyMan
2004-05-24 17:06
2004.07.25
Хочу разобраться с IdFTP (Indy FTPClient)