Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.12;
Скачать: CL | DM;

Вниз

Почему возникает ошибка в оконной процедуре ?   Найти похожие ветки 

 
Nick N A   (2002-10-27 08:55) [0]

Почему возникает ошибка в оконной процедуре WndProc ?
xoчу свою форму размером в 50 к-байт
у меня все получилось кроме Wnd proc и загрузки компонентов
из ресурсов.
Получилась даже загрузить форму из ресурсов отредактированую средствами VCL.

Type
TProcChain=record
Next:pointer;
Self:pointer;
Proc:pointer;
end;

...
TMQForm=class(TComponent)
...

procedure TMQForm.CreateWnd;
Var p:pointer;
begin
FWndProc:=PeekMessage;
p:=@FWndProc;
AddChain(FirstChain,FChain,Self,p);// добавим себя в цепочку
FClassName:=self.ClassName+"A"+#0;//Name+#0;
fillChar(fclass,SizeOf(fclass),0);
//fclass.style:=CS_HREDRAW or CS_VREDRAW;
fclass.lpfnWndProc:=@HWndProc;
fclass.hbrBackground:=COLOR_WINDOW+1;
fclass.lpszClassName:=@FClassName[1];
fclass.cbSize:=SizeOf(fclass);
fclass.hInstance:=HInstance;
fclass.hIcon:=LoadIcon(HInstance,"MAINICON");
fclass.hCursor:=LoadCursor(0,IDC_ARROW);
FAtom:=Windows.RegisterClassEx(fclass);
// сначало нужно создать класс, а затем окно на его базе
hWnd:=CreateWindowEx(
0
//or WS_EX_APPWINDOW
//or WS_EX_TRANSPARENT
,fclass.lpszClassName,@FCaption[1],
0
//or WS_BORDER
//or WS_CAPTION
or WS_CLIPSIBLINGS
or WS_SYSMENU
//or WS_OVERLAPPEDWINDOW {add system button & menu}
//WS_POPUP or WS_CAPTION //or WS_CLIPSIBLINGS or WS_SYSMENU or WS_MINIMIZEBOX
,Left,Top,Width,Height,0,0,hInstance,nil);
i:=GetLastError;
if hWnd<>0 then ShowWindow(hWnd,sw_show);
end;

function TMQForm.PeekMessage(HWND: hWnd; Msg: UInt; WPARAM: wParam;
LPARAM: lParam):LongBool;cdecl;
Var ms:TMessage;
i:integer;
begin
result:=false;
end;

Procedure AddChain(Var First,this:TProcChain;Self:TObject;Proc:pointer);
// ДОБАВЛЯЕТ адрес процедуры получения сообщений в цепочку
Var C:PTProcChain;
p:pointer;
Begin
C:=@First;
while C.Next<>nil do C:=c.Next;
c.Next:=@this;
this.Proc:=proc;
this.Self:=self;
end;

procedure HWndProc(hWnd,uMsg,wParam,hParam:Integer);cdecl;assembler;
// Процедура класса, должна разослать сообщения
// всем окнам (я регистрирую их цепочкой с помощью AddChain)
asm
//leave;jmp DefWindowProc;// убрать-отладить
push ebx;push esi;push edi;
mov ecx,offset FirstChain.Next;
test ecx,ecx;jz @NoAccept;// exit
@Find:
mov ecx,[ecx];
test ecx,ecx;jz @NoAccept;
push ecx;
PUSH hParam;
PUSH wParam;
PUSH uMsg;
PUSH hWnd;
push dword ptr [ecx+4];
call dword ptr [ecx+8];
add esp,5*4;
test eax,eax;
pop ecx;
jz @Find;
pop edi;pop esi; pop ebx;
leave;
ret 16;// инструкция создания окон на asm
// но при РеекМеssage=True здесь возникает ошибка
@NoAccept:
pop edi;pop esi; pop ebx;
leave;
jmp DefWindowProc;
end;


 
Almaz ©   (2002-10-28 01:56) [1]

Оконную функцию определите не
procedure HWndProc(hWnd,uMsg,wParam,hParam:Integer); cdecl;assembler;,
а
function HWndProc(hWnd,uMsg,wParam,hParam:Integer): Integer; stdcall; assembler;

Удачи.


 
Nick N A   (2002-10-30 03:45) [2]

Не работает, немогли-бы привести работоспособный пример,(можно по-почте)

function HWndProc(hWnd,uMsg,wParam,hParam:Integer):integer;stdcall;assembler;
// Процедура класса, должна разослать сообщения
// всем окнам (я регистрирую их цепочкой с помощью AddChain)
asm
push ebx;push esi;push edi;
...
...
jz @Find;
pop edi;pop esi; pop ebx;

leave;
jmp @End;
@End:
...
mov result,0;
end;



 
Nick N A   (2002-10-30 03:46) [3]

А у вас работает ?


 
Almaz ©   (2002-10-30 23:31) [4]


> Nick N A (30.10.02 03:46)
> А у вас работает ?

Не знаю, не пробовал.

И вообще совет - пишите на паскале. В данном случае, используя ассемблер, вы врядли что-нибудь выиграете в скорости/размере, но сильно усложните себе жизнь. Поверьте, у Delphi очень хороший оптимизатор кода.

Удачи.



Страницы: 1 вся ветка

Текущий архив: 2002.12.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
4-36462
Dm9
2002-10-30 07:20
2002.12.12
Как отловить создание файла/папки без постоянного сканирования?


1-36162
Alek_1
2002-11-30 02:06
2002.12.12
ImageList


1-36083
eruc
2002-12-02 20:58
2002.12.12
smart move ......................


6-36326
Осирис
2002-10-17 13:47
2002.12.12
Примеры к Indy9


3-36056
Григорий Ситнин
2002-11-22 15:18
2002.12.12
Защита файлов базы Interbase