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

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

Динамическое подключение dll. [D6, Win2k]


Страницы:   1 2

bloodman ©   (2004-07-13 19:33:00) 

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

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

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

FreeLibrary(fhandle);
inherited;

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


Reindeer Moss Eater   (2004-07-14 09:02:00) [1]

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


bloodman   (2004-07-13 21:02:00) [2]

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


bloodman   (2004-07-13 20:15:00) [3]

вот весь 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.


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

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


bloodman   (2004-07-13 20:10:00) [5]

Сделал так:
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?


bloodman   (2004-07-13 20:08:00) [6]

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


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


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

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

bloodman ©   (13.07.04 19:59) [24]

см. [25]


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

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

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


bloodman   (2004-07-13 19:59:00) [9]

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

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


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


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

это то зачем?


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

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;


Reindeer Moss Eater   (2004-07-13 19:56:00) [12]

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

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


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

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

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


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

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

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


bloodman   (2004-07-13 19:54:00) [15]

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:00) [16]

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


bloodman   (2004-07-13 19:53:00) [17]

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

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


Reindeer Moss Eater   (2004-07-13 19:52:00) [18]

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


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

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


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

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


Страницы:   1 2

Наверх

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