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

Вниз

И снова про 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 вся ветка

Форум: "KOL";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.043 c
3-1116440985
Сергей2345
2005-05-18 22:29
2005.06.29
Поможет ли Delfi?


1-1117654366
Drow
2005-06-01 23:32
2005.06.29
непонятный Error


6-1112208880
Urvin
2005-03-30 22:54
2005.06.29
ICQ посредством Delphi


14-1117465281
HBreaker
2005-05-30 19:01
2005.06.29
Как вывести строчку на принтер использую assembler и прерывания


3-1116318754
ANB
2005-05-17 12:32
2005.06.29
Как указать сортровку при апдейте в Оракле ?





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