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

Вниз

Ошибка обращения по адресу при вызове функции из dll   Найти похожие ветки 

 
kasper111   (2005-01-22 13:00) [0]

помогиту плызз
вот ..исходники dll
library ean;

{ Important note about DLL memory management: ShareMem must be the
 first unit in your library"s USES clause AND your project"s (select
 Project-View Source) USES clause if your DLL exports any procedures or
 functions that pass strings as parameters or function results. This
 applies to all strings passed to and from your DLL--even those that
 are nested in records and classes. ShareMem is the interface unit to
 the BORLNDMM.DLL shared memory manager, which must be deployed along
 with your DLL. To avoid using BORLNDMM.DLL, pass string information
 using PChar or ShortString parameters. }

uses
 ShareMem,Windows,
 Messages,
 SysUtils,
 Classes,
 Db,
 ADODB,
 Forms,  
 Unit1 in "Unit1.pas" {FmEan};

{$R *.RES}
function Init_Dll(ApHandle :THandle) :Integer; {}
begin
Application.Handle := ApHandle;
FmEan := TFmEan.Create(Application);
//fmEan.FConnection.Connection := KisConnect;
Init_Dll:=1;
FmEan.ShowModal;
end;

Exports
Init_Dll;

begin
end.

вот вызывающего модуля
unit Unit1;

interface

uses
 ShareMem,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, Db, ADODB;

type
 TForm1 = class(TForm)
   Button1: TButton;
   ADOConnection1: TADOConnection;
   procedure Button1Click(Sender: TObject);

 private
   { Private declarations }
 public
   { Public declarations }
 end;
type
ELoadErrorDLL = class(Exception); {56353 48806 ошибка при загрузке DLL}

{ Процедура экспортится из ShareLib, для работы с Shared memory }
//procedure GetDLLData(var AGlobalData: TPointer_GD); StdCall External "SHARELIB.DLL";

var
 Form1: TForm1;
 init_Dll: function(ApHandle :THandle):Integer;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
libHandle : Thandle;
begin

LibHandle :=LoadLibrary(Pchar(ExtractFilePath(Application.ExeName)+"ean.dll"));
@init_dll:=GetProcAddress(libHandle,"init_dll");
init_Dll(Application.Handle);

end;

end.

при попытке вызвать из dll функцию init_dll вылетает ошибка обращения по адресу памяти... не подскажите что я упустил??


 
GuAV ©   (2005-01-22 13:05) [1]


> "init_dll"



>Exports
> Init_Dll;


Есть подозрение что в регистре дело


 
GuAV ©   (2005-01-22 13:08) [2]

И вообще, кто будет проверять результат
LibHandle :=LoadLibrary(Pchar(ExtractFilePath(Application.ExeName)+"ean.dll"));
if LibHandle = 0 then RaiseLastWin32Error;
@init_dll:=GetProcAddress(libHandle,"init_dll");
if not Assigned(init_dll) then RaiseLastWin32Error;

И хендл dll надо FreeLibrary. И смысл дин загрузки ?


 
Digitman ©   (2005-01-22 13:30) [3]

ShareMem must be the first unit in your library"s USES clause AND your project"s (select Project-View Source) USES clause

для начала, если уж необходимо, выполни эти требования именно так как указазано в замечании, безо всякой отсебячины

но необходимости такой в коде твоем нет, потому что нет условий, опять же указанных в том самом замечании :

if your DLL exports any procedures or functions that pass strings as parameters or function results

это - раз.

теперь дальше поехали ..

ЗАЧЕМ ты передаешь параметром в библ.ф-цию хэндл гл.окна приложения ? каков глубоко скрытый смысл в этом ?

ну и наконец о главном - ошибка происходит из-за того что GetProcAddress вернула nil : импортируемая ф-ция имеет имя "Init_Dll", в то время как ты желаешь получить адрес ф-ции с именем "init_dll", которой попросту нет в библиотеке .. имена эксп.ф-ций регистрозависимы !


 
GuAV ©   (2005-01-22 14:14) [4]


> ЗАЧЕМ ты передаешь параметром в библ.ф-цию хэндл
> гл.окна приложения ? каков глубоко скрытый смысл в
> этом ?

Handle + F1 -> Handle property (TApplication) ->Note.


 
Digitman ©   (2005-01-22 14:26) [5]


> GuAV ©   (22.01.05 14:14) [4]


ну и что ? это вовсе не обязательное требование... тем более с учетом того, что автор , как видно из кода, визуализирует свою форму не иначе как модально ..


 
GuAV ©   (2005-01-22 14:40) [6]


> не иначе как модально ..

Даже в этом случае лучше присвоить Application.Handle т.к. иначе будет две кнопки на taskbar и возможность активировать главную формы с помощью них... IMHO Вы зря придрались к этому.


 
Digitman ©   (2005-01-22 14:49) [7]


> GuAV ©   (22.01.05 14:40) [6]


> IMHO Вы зря придрались к этому


просто я вижу неосознаннаное или не вполне осознанное автором следование комментариям из справки


> Даже в этом случае лучше присвоить Application.Handle


коль оба взаимодействующих проекта используют VCL, проще и надежней будет передать параметром не хэндл окна, а ссылку на объект Application, созданный хост-приложением .. в этом случае будет все в порядке и с taskbar"ом и со владением создаваемых в библ-ке VCL-объектов, имеющих owner"ом любой из VCL-объектов в составе хост-приложения


 
kasper111   (2005-01-22 14:51) [8]

спасибо всем большое... все получилось()


 
GuAV ©   (2005-01-22 15:11) [9]

Digitman ©   (22.01.05 14:49) [7]

> проще и надежней будет передать параметром не хэндл
> окна, а ссылку на объект Application, созданный
> хост-приложением .. в этом случае будет все в порядке
> и с taskbar"ом и со владением создаваемых в библ-ке
> VCL-объектов, имеющих owner"ом любой из VCL-объектов в
> составе хост-приложения


Проблемы с владением не вижу. Какая связь между переменнной application и owner"ом ? Формы приложения могут быть owner"ом не зависимо от того, является ли их owner"ом application или нет. Как мне представляется, всё что необходимо для такого владения - это sharemem, чтобы объекты созданные в dll могли освобождаться в ехе.
Также не вижу смысла владения dll - компонентов ехе компонентами. IMHO, они должны владется именно dllовским application, чтобы быть благополучно освобождёнными при выгрузке dll.

В данной задаче, вообще-то смысла владения нет - переменную модальной формы можно сделать локальной, и освобождать эту форму сразу после попытки использования.



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

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

Наверх





Память: 0.48 MB
Время: 0.035 c
4-1103638913
Grant
2004-12-21 17:21
2005.02.06
Работа приложения


4-1103098515
pavel_guzhanov
2004-12-15 11:15
2005.02.06
Остановка процесса на удаленном компьютере


4-1103105914
-=SS=-
2004-12-15 13:18
2005.02.06
Странное поведение Dll


1-1106729414
Angela
2005-01-26 11:50
2005.02.06
Чтобы Panel1 и Panel2 не пересекались!


1-1105985683
Ермак
2005-01-17 21:14
2005.02.06
TForm::OnShow





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