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

Вниз

И снова про DLL :o)   Найти похожие ветки 

 
MTsv DN   (2004-11-28 11:15) [0]

Всем привет...
В топиках не нашел хотя бы мало-мальскую полезную информацию по такому вопросу.....

Вот проект...

///////////////////////// DLL //////////////////////////////
library dll;

uses Kol, Windows;

var
Form, Edit, _AParent : PControl;
_EditText_ : string;

procedure KOLForm1Close( Dummy : Pointer; Sender : PControl );
begin
_AParent.Enabled := true;
end;

procedure EditChange( Dummy : Pointer; Sender : PControl );
begin
  _EditText_ := Edit.Text;
end;

procedure CreateFormWindow(AParent: PControl; _EditText : string);
begin
 Form := NewForm( AParent, "Test" ).SetPosition( 550, 686 ).SetClientSize( 345, 227 );
 Form.Add2AutoFree( Form );
   Form.Style := Form.Style and not (WS_MINIMIZEBOX or WS_MAXIMIZEBOX);
   Form.StayOnTop := True;
   Form.Font.FontHeight := 13;
   Form.Font.FontCharset := 0;
   Form.CenterOnParent.CanResize := False;
   Form.OnClose :=  TOnEventAccept(MakeMethod(nil, @KOLForm1Close));

   Edit := NewEditBox( Form, [  ] ).SetPosition( 112, 13 ).SetSize( 225, 19 );
   Edit.Text := _EditText;
   Edit.OnChange := TOnEvent(MakeMethod(nil, @EditChange));

   Form.CreateWindow;
   _EditText_ := _EditText;
   _AParent := AParent;
end;

procedure GetData(var Res : string);
begin
Res := _EditText_;
end;

exports
 CreateFormWindow index 1,
 GetData index 2;
begin
end.
///////////////////////// DLL //////////////////////////////

///////////////////////// PROJECT //////////////////////////////
{ KOL MCK } // Do not remove this line!
{$DEFINE KOL_MCK}
unit Unit1;

interface

{$IFDEF KOL_MCK}
uses Windows, Messages, ShellAPI, KOL {$IFNDEF KOL_MCK}, mirror, Classes, Controls, mckControls, mckObjs, Graphics,
 mckCtrls {$ENDIF};
{$ELSE}
{$I uses.inc}
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;
{$ENDIF}

type
 {$IFDEF KOL_MCK}
 {$I MCKfakeClasses.inc}
 {$IFDEF KOLCLASSES} TForm1 = class; PForm1 = TForm1; {$ELSE OBJECTS} PForm1 = ^TForm1; {$ENDIF CLASSES/OBJECTS}
 {$IFDEF KOLCLASSES}{$I TForm1.inc}{$ELSE} TForm1 = object(TObj) {$ENDIF}
   Form: PControl;
 {$ELSE not_KOL_MCK}
 TForm1 = class(TForm)
 {$ENDIF KOL_MCK}
   KOLProject1: TKOLProject;
   KOLForm1: TKOLForm;
   Button1: TKOLButton;
   procedure Button1Click(Sender: PObj);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;

{$IFDEF KOL_MCK}
procedure NewForm1( var Result: PForm1; AParent: PControl );
{$ENDIF}

implementation

{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}

{$IFDEF KOL_MCK}
{$I Unit1_1.inc}
{$ENDIF}

procedure TForm1.Button1Click(Sender: PObj);
var
 H1 : THandle;
 H2 : THandle;
 _test_ : string;
 CreateFormWindow :  procedure (AOwner : PControl; _BI : string);
 GetData :   procedure (var Res : string);
begin
if FileExists(ExtractFilePath(ParamStr(0)) + "dll.dll") then
  begin
   Form.Enabled := false;
   _test_ := "Test";

   H1 := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + "dll.dll"));
   @CreateFormWindow := GetProcAddress(H1, "CreateFormWindow");
   if Assigned( CreateFormWindow ) then CreateFormWindow(Form, _test_);

   repeat
    Form1.Form.ProcessMessages;
   until Form.Enabled;

   H2 := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + "dll.dll"));
   @GetData := GetProcAddress(H2, "GetData");
   if Assigned( GetData ) then GetData(_test_);

   FreeLibrary(H2);
   FreeLibrary(H1);
   MsgOk(_test_);    ///////////ОШИБКА ЗДЕСЬ (ERROR 216)
  end;
end;

end.
///////////////////////// PROJECT //////////////////////////////


А теперь вопрос :о) Почему такой, казалось бы, простой код, дает ошибку...

P.S. Ошибка не в MsgOk(_test_); а в последней строке, т.е. если бы строки MsgOk(_test_); не было бы, то ошибка выдавалась бы в строке FreeLibrary(H1);

Заранее СПАСИБО... MTsv DN


 
ecm ©   (2004-11-28 11:42) [1]

На вскидку .. по-моему у тебя нет понимания работы с DLL
Порядок работы должен быть примерно таким:
LoadLibrary ...
Var1 := GetProcAddress...
Var2 := GetProcAddress...
...какие-то действия с полученными Var...
FreeLibrary ...
За остальное - нескажу надо смотреть внимательнее


 
ecm ©   (2004-11-28 11:46) [2]

З.Ы.  - нет НИКАКОЙ надобности на каждый GetProcAddress дергать LoadLibrary одной и той-же библиотеки


 
MTsv DN   (2004-11-28 12:01) [3]

ecm,Извини,но разницы никакой... В смысле, конечного результата...

Исправил, как ты посоветовал, но после FreeLibrary, обнуляется локальная переменная _test_, отсюда и ошибка...
Если поставить MsgOk(_test_) до FreeLibrary все нормально,но при закрытии приложения опять "ERROR 216"...

Кстати, у меня действительно нет понятия о работе с DLL :0) Поэтому и прошу помощи у кого это понятие есть :0)

С уважением MTsv DN


 
ecm ©   (2004-11-28 13:45) [4]

Есстественно - ты же выгрузил библиотеку (модуль) при выгрузке
которого - память отводимая под строку в билиотеке освобождается.
А ты ЗАТЕМ пытаешься к ней обращаться и справедливо получаешь
в ответ 216!
Используй _test_ до выгрузки... или скопируй значение в другую страку.
И почитай про ShareMem в справке Делфи - при использовании
строк в ДЛЛ без него могут быть неожиданные эффекты. Осообенно
в много-поточных приложениях


 
ecm ©   (2004-11-28 13:51) [5]

З.Ы. Кстати вся эта тема - сполшной оффтоп - никакого отношения
ни к КОЛ ни к МЦК ..
.. на месте модера я бы все это дело перенес в другую ветку :)


 
MTsv DN   (2004-11-28 14:23) [6]

ecm ©, ОГРОМНОЕ СПАСИБО!!!!! Хотя _test_ и локальная, но она типа string, надо было только на PChar изменить и все.....

Еще раз спасибо...

MTsv DN



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

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
10-1093680682
Николай
2004-08-28 12:11
2005.06.29
Delphi + MSAccess


6-1111926043
Mylen Farmer
2005-03-27 16:20
2005.06.29
Проверка состояния соединения


14-1117835054
кактусбел
2005-06-04 01:44
2005.06.29
вычесление значение суммы рядов бесконечного ряда


4-1115562724
4dept
2005-05-08 18:32
2005.06.29
Как расшарить папку только на чтение в NT


1-1118034883
Dyakon_Frost
2005-06-06 09:14
2005.06.29
Просмотр flash-ек!