![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое подключение dll. [D6, Win2k]
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]
Я даже функции не использую(пока) я только класс написал , захотел проверить , вот ми проверил...