Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1175616972
И. Павел
2007-04-03 20:16
2007.04.29
Документация и бета тестирование


2-1175584401
Rooot
2007-04-03 11:13
2007.04.29
caFree


5-1152603818
Maxim-13
2006-07-11 11:43
2007.04.29
ПОМОГИТЕ НАЙТИ КОМПОНЕНТ!


15-1175840061
Anubis2
2007-04-06 10:14
2007.04.29
Создание текстового файла


15-1175778266
{RASkov}
2007-04-05 17:04
2007.04.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский