delphi写的整合汇编与api的简单的窗口程序
program Project1;
{ Types and Structures Definition }
type
WNDCLASSEX = packed record
cbSize: LongWord;
style: LongWord;
lpfnWndProc: Pointer;
cbClsExtra: Integer;
cbWndExtra: Integer;
hInstance: LongWord;
hIcon: LongWord;
hCursor: LongWord;
hbrBackground: LongWord;
lpszMenuName: PAnsiChar;
lpszClassName: PAnsiChar;
hIconSm: LongWord;
end;
POINT = packed record
X: Longint;
Y: Longint;
end;
MSG = packed record
hwnd: LongWord;
message: LongWord;
wParam: Longint;
lParam: Longint;
time: LongWord;
pt: POINT;
end;
{ Application Specific Variables and constants }
const
szBuf = 255; // Size of buffer used to handle strings
WndClsSize = SizeOf(WNDCLASSEX); // Size of WNDCLASSEX Structure
wnd_class: PChar = 'TMainWindow'; // Main window class name.
wnd_title: PChar = 'Closer to the Metal'; // Main window caption.
var
wcx : WNDCLASSEX; // Main window structure
msgbuf : MSG; // Message structure
hwnd : LongWord; // A window handle
{ Windows Specific Constants }
const
{ Class styles }
CS_VREDRAW = LongWord(1);
CS_HREDRAW = LongWord(2);
CS_GLOBALCLASS = $4000;
{ Color Types }
COLOR_WINDOW = 5;
{ Window Styles }
WS_OVERLAPPED = 0;
WS_CAPTION = $C00000; { WS_BORDER or WS_DLGFRAME }
WS_SYSMENU = $80000;
WS_THICKFRAME = $40000;
WS_MINIMIZEBOX = $20000;
WS_MAXIMIZEBOX = $10000;
WS_VISIBLE = $10000000;
{ Common Window Styles }
WS_OVERLAPPEDWINDOW = (WS_VISIBLE or WS_OVERLAPPED or WS_CAPTION
or WS_SYSMENU or WS_THICKFRAME or WS_MINIMIZEBOX or WS_MAXIMIZEBOX);
{ Messages }
WM_DESTROY = $0002;
{ Windows API's }
function GetModuleHandle(lpModuleName: PChar): HMODULE;
stdcall; external 'kernel32.dll' name 'GetModuleHandleA';
procedure ExitProcess(uExitCode: LongWord);
stdcall; external 'kernel32.dll' name 'ExitProcess';
function DefWindowProc(hWnd: LongWord; Msg: LongWord;
wParam: Longint; lParam: Longint): Longint;
stdcall; external 'user32.dll' name 'DefWindowProcA';
function RegisterClassEx(const WndClass: WNDCLASSEX): Word;
stdcall; external 'user32.dll' name 'RegisterClassExA';
function CreateWindowEx(dwExStyle: LongWord; lpClassName: PChar;
lpWindowName: PChar; dwStyle: LongWord;
X, Y, nWidth, nHeight: Integer; hWndParent: LongWord;
hMenu: LongWord; hInstance: LongWord; lpParam: Pointer): LongWord;
stdcall; external 'user32.dll' name 'CreateWindowExA';
function GetMessage(var lpMsg: MSG; hWnd: LongWord;
wMsgFilterMin, wMsgFilterMax: LongWord): LongBool;
stdcall; external 'user32.dll' name 'GetMessageA';
function DispatchMessage(const lpMsg: MSG): Longint;
stdcall; external 'user32.dll' name 'DispatchMessageA';
procedure PostQuitMessage(nExitCode: Integer);
stdcall; external 'user32.dll' name 'PostQuitMessage';
{ Windows Procedure }
function WindowProc(hWnd, Msg: LongWord; wParam, lParam: Longint): Longint; stdcall;
asm
// The inline assembler will take care of setting the stack,
// preserving the registers and returning.
mov EAX, [Msg]
// WM_DESTROY:
cmp EAX, WM_DESTROY
je @@m_destroy
// All Other Messages:
jmp @@defwndproc
@@m_destroy:
push 0
call PostQuitMessage // Quit.
jmp @@return
@@defwndproc:
push [lParam]
push [wParam]
push [Msg]
push [hWnd]
call DefWindowProc
jmp @@finish
@@return:
xor eax,eax
@@finish:
end;
{ Main Program Block }
asm
// GetModuleHandle with a NULL pointer gives us the instance handle
// of the EXE file. This is the module that will "own" the window class.
push 0
call GetModuleHandle
// Define our window properties:
mov [wcx.cbSize], WndClsSize;
mov [wcx.style], CS_VREDRAW or CS_HREDRAW or CS_GLOBALCLASS
mov [wcx.lpfnWndProc], offset WindowProc
mov [wcx.cbClsExtra], 0
mov [wcx.cbWndExtra], 0
mov eax, hInstance
mov [wcx.hInstance], EAX
mov [wcx.hIcon], 0
mov [wcx.hCursor], 0
mov [wcx.hbrBackground], COLOR_WINDOW + 1
mov dword ptr [wcx.lpszMenuName], 0
mov dword ptr [wcx.lpszClassName], offset wnd_class
mov [wcx.hIconSm], 0
mov EAX, wnd_class
mov [wcx.lpszClassName], EAX
// Register window class:
push offset wcx
call RegisterClassEx
// Create window:
push 0 // lpParam
push [wcx.hInstance] // hInstance
push 0 // hMenu
push 0 // hWndParent
push 200 // nHeight
push 200 // nWidth
push 100 // y (top)
push 100 // x (left)
push WS_OVERLAPPEDWINDOW // dwStyle
mov EAX, wnd_title // lpWindowName
push EAX
mov EAX, wnd_class // lpClassName
push EAX
push 0 // dwExStyle
call CreateWindowEx
mov hwnd, EAX
// Message Loop/Pump:
@@msg_loop:
push 0 // wMsgFileterMax
push 0 // wMsgFilterMin
push 0 // hWnd (0 = all windows)
push offset msgbuf // lpMsg
call GetMessage
cmp eax, 0 // Returns 0 (zero) if WM_QUIT
jz @@end_loop
push offset msgbuf
call DispatchMessage
jmp @@msg_loop
@@end_loop:
// Terminating the program:
push 0 // Error return code.
call ExitProcess
end.
http://blog.csdn.net/diligentcatrich/article/details/9497503
delphi写的整合汇编与api的简单的窗口程序的更多相关文章
- Win32汇编学习(3):简单的窗口
这次我们将写一个 Windows 程序,它会在桌面显示一个标准的窗口,以此根据代码来学习如何创建一个简单的窗口. 理论: Windows 程序中,在写图形用户界面时需要调用大量的标准 Windows ...
- win32汇编简单实现窗口程序
.386 .model flat,stdcall option casemap:none ;========================== ;include部分 include windows. ...
- (Delphi)第一个Windows 32 API的窗口程序
program Project1; uses Winapi.Windows, Winapi.messages; {$R *.res} const className = 'MyDelphiWindow ...
- Win32编程API 基础篇 -- 2.一个简单的窗口 根据英文教程翻译
一个简单的窗口 例子:简单的窗口 有时人们在IRC提问,”我应该怎样制作一个窗口”...嗯,这恐怕不是完全这么简单好回答!其实这并不难一旦你明白你在做什么,但在你得到一个可展示的窗口之前还有一些事情需 ...
- Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Discuz!
Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Disc ...
- Delphi写的DLL,OCX中多线程一个同步问题
Delphi写的DLL,OCX中如果使用了TThread.Synchronze(Proc),可能导致线程死锁,原因是无法唤醒EXE中主线程, Synchronze并不会进入EXE主线程消息队列. 下面 ...
- 用delphi写多屏幕程序
http://blog.csdn.net/zyyjc/article/details/6530728 别现在有些POS机是双屏幕的(比如卡西瓦POS机),一个屏幕可以当顾客显示屏用,当闲时也可以显示一 ...
- springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务
springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...
- 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...
随机推荐
- ZRender源码分析4:Painter(View层)-中
回顾 上一篇说到:ZRender源码分析3:Painter(View层)-上,接上篇,开始Shape对象 总体理解 先回到上次的Painter的render方法 /** * 首次绘图,创建各种dom和 ...
- 网页设计之PS画渐变线条
第一种线条的画法:画两条直线,这两条直线是 以背景色为基础 , 一个比背景色深 ,一个比背景色浅``. 第二种线条的画法:第一种画法是 图层样式 渐变叠加 叠加一个 背景色 到中间色 再到背景 ...
- 手机开机提示SD卡受损
手机开机提示SD卡受损,手机不显示内存卡,有人会选择换新卡或者格式化内存卡,如果刚好木有备份,内存卡上的珍藏丢失了多心痛啊.其实,我们可以通过电脑救活提示受损的内存卡,前后不超过5分钟... 方法:1 ...
- jquery ajax提交及请求
jQuery.ajax({ url: dataURL, success: function(results) { var parsedJson = jQuery.parseJSON(results); ...
- Python:staticmethod vs classmethod
Being educated under Java background, static method and class method are the same thing. But not so ...
- AutoItLibrary库入门
一.AutoItLibrary入门 1. 为什么要使用AutoItLibrary Selenium2library在我们实际测试web页面的时候基本上已经够用了,不过还是会有部分情况下会脱离Selen ...
- docker 数据管理3
实际应用: 第一个容器使用: docker run -itd -v /data/:/data1 centos bash // -v 用来指定挂载目录, 后面的容器使用之前的容器数据卷 docker: ...
- nexus 7 2013 驱动安装及root
驱动安装 Nexus 7 2013连接上电脑后,设备管理器显示新设备 nexus 7 待安装驱动(其实是MTP设备待安装驱动).去谷歌网站下载最新的USB驱动,version 8.0 的.与以前的版本 ...
- OpenLayers 添加OpenStreetMap(OSM)瓦片层示例
This article from:http://wiki.openstreetmap.org/wiki/OpenLayers_Simple_Example Deploy an OpenStreetM ...
- unity 距离某天还有多久
距离某一天还有多久,简单的小例子. using UnityEngine; using System.Collections; using System; public class test : Mon ...