Главная страница
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.033 c
14-1117747082
Просто Джо
2005-06-03 01:18
2005.06.29
Горан Брегович - всякие корни и пни маздай


14-1117589651
WondeRu
2005-06-01 05:34
2005.06.29
Долго Вы писали свой диплом? :)


1-1118060979
tunguss
2005-06-06 16:29
2005.06.29
Этика классов и сортировка TList...


1-1117648972
3PO
2005-06-01 22:02
2005.06.29
Дефрагментация кучи: Навяено веткой Ошибка "Out of memory"


1-1117695588
Egor
2005-06-02 10:59
2005.06.29
Ассоциировать файл с программой