Форум: "KOL";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];
ВнизApi и KolPng в dll Найти похожие ветки
← →
parovoZZ © (2006-09-04 14:27) [0]Здарова, это опять я))
Не надо говорить, что я извращенец))
В dll запихнул простенькое такое окно на апях (+ формы KOL) и туда же юнит KolPng. Всё работает отлично, но при выгрузке dll генерируется ошибка. Покопался в исходниках и сделал следующееinitialization
ImagePng := NewPngObject;
finalization
ImagePng.Free;
ImagePng := nil;
Applet.Free;
Так или нет?
← →
parovoZZ © (2006-09-04 14:37) [1]Почему спрашиваю.
При добавлении полседней строчки в кодеNewAccess_Form (Access_Form, pointer (Applet));
result := Access_Form.Form.ShowModal;
Access_Form.Form.Free;
//Access_Form.Free; //а нужно ли оно?
валится ошибка.
Может из-за того, что
type
.....
Access_Form: TKOLForm;
.....
end;
var
Access_Form {$IFDEF KOL_MCK} : PAccess_Form {$ELSE} : TAccess_Form {$ENDIF} ;
← →
MTsv DN © (2006-09-04 14:50) [2]> При добавлении полседней строчки в коде
> NewAccess_Form (Access_Form, pointer (Applet));
> result := Access_Form.Form.ShowModal;
> Access_Form.Form.Free;
> //Access_Form.Free; //а нужно ли оно?
> валится ошибка.
2 parovoZZ
Тебя же уже направляли в KOL.PAS. Там уже есть ответ на твой вопрос:
*********************************************************! procedure TForm1.Button1Click( Sender: PObj );
*********************************************************
! begin
! NewForm2( Form2, Applet );
! Form2.Form.ShowModal;
! Form2.Form.Free; // Never call Form2.Free or Form2.Form.Close
! end; // but always Form2.Form.Free; (!)
А от себя добавлю... В данном примере, вместо Form2.Form.Free, лучше использовать Free_And_Nil(Form2.Form)
← →
parovoZZ © (2006-09-04 16:32) [3]Так а почему без Applet.Free (см [0]) валится ошибка? Даже если я работаю только с апишным окном?
А без Form2.Free при выгрузке dll -ки тоже генерится ошибка. Ошибки нет, если dll-ку выгружать вместе с закрытием exe. Но мне надо её выгружать динамически.
Апишное окноunit Connect;
interface
uses Windows, Messages, KolPng;
procedure Show; stdcall;
procedure EndShow; stdcall;
implementation
uses
Access;
{$R Forms.res}
var
DlgHandle : THandle;
procedure Centering (Handle : THandle);
var
Rect : TRect;
iWidth, iHeight : word;
begin
GetWindowRect (Handle, Rect);
iWidth := Rect.right - Rect.left;
iHeight := Rect.bottom - Rect.top; //центровка диалога
Rect.left := (GetSystemMetrics (SM_CXSCREEN) - iWidth) Div 2;
Rect.top := (GetSystemMetrics (SM_CYSCREEN) - iHeight) Div 2;
MoveWindow (Handle, Rect.left, Rect.top, iWidth, iHeight, False);
SetForegroundWindow (Handle);
end;
function ConnectShowProc (DlgHandle: THandle; Msg, wParam, lParam: Integer) : boolean; stdcall;
var
DC : HDC;
begin
result := WordBool (0);
case Msg of
WM_ShowWindow : begin
Centering (DlgHandle);
end;
WM_Paint : begin
DC := GetDC (DlgHandle);
if ImagePng <> nil then ImagePng.Draw(DC, 0, 0);
ReleaseDC (DlgHandle, DC);
end;
WM_LButtonDown : SendMessage(DlgHandle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
WM_Destroy : begin
Exit;
end;
end;
end;
procedure Show;
begin
//ImagePng := NewPngObject;
if ImagePng <> nil then
ImagePng.LoadFromResourceName (hInstance, "Connect");
DlgHandle := CreateDialog (hInstance, "ConnectShow", 0, @ConnectShowProc);
end;
procedure EndShow;
begin
DestroyWindow (DlgHandle);
end;
end.
← →
MTsv DN © (2006-09-04 19:57) [4]2 parovoZZ
Слушай, сделай минимальный проект, при котором вылетает ошибка... А то кусками код "кидаешь", а другие собирай воедино... В [3], где закомментировал ImagePng, где нет... Это твой unit, а на фига он отдельно нужен-то???
← →
parovoZZ © (2006-09-05 15:20) [5]Проект
{ KOL MCK } // Do not remove this line!
library OJRes;
{ 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
KOL,
Access in "Access.pas" {Access_Form},
Connect in "Connect.pas";
exports
Login name "Login",
PostInfo name "PostInfo",
Show name "Show",
EndShow name "EndShow";
{$R OJ.res}
begin // PROGRAM START HERE -- Please do not remove this comment
{$IFDEF KOL_MCK} {$I OJRes_0.inc} {$ELSE}
{$ENDIF}
end.
← →
parovoZZ © (2006-09-05 15:27) [6]Юнит с mck формой
{ KOL MCK } // Do not remove this line!
{$DEFINE KOL_MCK}
unit Access;
interface
{$IFDEF KOL_MCK}
uses Windows, Messages, ShellAPI, KOL {$IFNDEF KOL_MCK}, mirror, Classes, Controls, mckControls, mckObjs, Graphics, mckCtrls,{$ENDIF (place your units here->)}, KOLPng;
{$ELSE}
{$I uses.inc}
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, mirror;
{$ENDIF}
type
{$IFDEF KOL_MCK}
{$I MCKfakeClasses.inc}
{$IFDEF KOLCLASSES} TAccess_Form = class; PAccess_Form = TAccess_Form; {$ELSE OBJECTS} PAccess_Form = ^TAccess_Form; {$ENDIF CLASSES/OBJECTS}
{$IFDEF KOLCLASSES}{$I TAccess_Form.inc}{$ELSE} TAccess_Form = object(TObj) {$ENDIF}
Form: PControl;
{$ELSE not_KOL_MCK}
TAccess_Form = class(TForm)
{$ENDIF KOL_MCK}
KOLProject1: TKOLProject;
Access_Form: TKOLForm;
KOLApplet1: TKOLApplet;
Login: TKOLEditBox;
Pswd: TKOLEditBox;
Label4: TKOLLabel;
Label5: TKOLLabel;
Label6: TKOLLabel;
Panel1: TKOLPanel;
CloseBtn: TKOLButton;
OKBtn: TKOLBitBtn;
CancelBtn: TKOLBitBtn;
procedure OKBtnClick(Sender: PObj);
procedure CnclBtnClick(Sender: PObj);
procedure Access_FormFormCreate(Sender: PObj);
procedure CloseBtnClick(Sender: PObj);
procedure Access_FormDestroy(Sender: PObj);
procedure Access_FormPaint(Sender: PControl; DC: HDC);
function Panel1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Access_Form {$IFDEF KOL_MCK} : PAccess_Form {$ELSE} : TAccess_Form {$ENDIF} ;
ImagePNG : PPngObject;
function Login : byte; stdcall;
procedure PostInfo (var aLogin, aPassword : ShortString); stdcall;
{$IFDEF KOL_MCK}
procedure NewAccess_Form( var Result: PAccess_Form; AParent: PControl );
{$ENDIF}
implementation
var
edLogin, edPassword : ShortString;
//result_ : byte = IDCLOSE;
{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}
{$IFDEF KOL_MCK}
{$I Access_1.inc}
{$ENDIF}
function Login : byte;
begin
NewAccess_Form (Access_Form, pointer (Applet));
result := Access_Form.Form.ShowModal;
Access_Form.Form.Free;
//Access_Form.Free;
//result := result_;
//Applet.Free;
end;
procedure TAccess_Form.OKBtnClick(Sender: PObj);
begin
edLogin := Login.Text;
edPassword := Pswd.Text;
Form.ModalResult := IDOK;
//Form.Close;
//result_ := ;
end;
procedure PostInfo (var aLogin, aPassword : ShortString);
begin
aLogin := edLogin;
aPassword := edPassword;
end;
procedure TAccess_Form.CnclBtnClick(Sender: PObj);
begin
Form.ModalResult := IDCANCEL;
//Form.Close;
//result_ := ;
end;
procedure TAccess_Form.Access_FormFormCreate(Sender: PObj);
begin
//ImagePng := NewPngObject;
if ImagePng <> nil then
ImagePng.LoadFromResourceName (hInstance, "Access");
end;
procedure TAccess_Form.CloseBtnClick(Sender: PObj);
begin
Form.ModalResult := IDCLOSE;
//result_ := ;
//Form.Close;
end;
procedure TAccess_Form.Access_FormDestroy(Sender: PObj);
begin
//ImagePng.Free;
//ImagePng := nil;
end;
procedure TAccess_Form.Access_FormPaint(Sender: PControl; DC: HDC);
begin
if ImagePng <> nil then
ImagePng.Draw (DC, 0, 0);
end;
function TAccess_Form.Panel1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
result := false;
if msg.message = WM_LButtonDown then
begin
SendMessage(Form.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
result := true;
end;
end;
initialization
ImagePng := NewPngObject;
finalization
ImagePng.Free;
ImagePng := nil;
Applet.Free; //без этой строчки валится ошибка при выгрузке dll
end.
Апишное окно приведено выше [3].
В таком варианте всё работает. И даже память не утекает. Смущает Applet.free. Каким он боком для апишного окна? Из-за KOLPng?
← →
MTsv DN © (2006-09-05 16:02) [7]Если честно, я не имел ввиду код твоего проекта...
Почитай здесь:
http://delphimaster.net/view/11-1151791408/
может что поможет...
> Каким он боком для апишного окна? Из-за KOLPng?
Ну, так удали KOLPng... Будет вывалиться ошибка...
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.046 c