Текущий архив: 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