Форум: "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