Форум: "Основная";
Текущий архив: 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