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窗口程序 首 ...
随机推荐
- Spring随笔 - 事务隔离级别
Spring提供5中事务隔离级别: ISOLATION_DEFAULT:使用数据库后端的默认隔离级别. ISOLATION_READ_UNCOMMITTED:允许读取尚未提交的数据变更.可能会导致脏读 ...
- linux下实现两人、三人无序对话功能
序:引子 对话功能实际上就是利用管道见得通信.最原始的是一方发另一方收,不能进项交互,发送方的代码如下: /*============================================ ...
- 行业百科知识--Github
行业百科知识普及: 一.github Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ru ...
- Windows 打开防火墙上的指定端口
第一步: 控制面板-->打开防火墙 第二步: 高级设置 第三步: 入站规则--->新建规则 第四步: 第五步: 第六步: 第七步: 第八步:
- Hibernate摘记
原理: 1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.xml中的<mapping reso ...
- javascript instanceof
object instanceof constructor instanceof运算符用来检测constructor.prototype是否存在于参数object的原型链上. 对于instanceof ...
- perl 对象 bless 引用
[root@dr-mysql01 ~]# cat aa.pl use LWP::UserAgent; use Data::Dumper; my $ua = LWP::UserAgent->new ...
- C语言的本质(2)——二进制、八进制、十六进制与十进制
二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世纪德国数理哲 ...
- Dialog 顶部黑线问题
Dialog 顶部黑线问题 样式如下: [java] view plaincopyprint? <style name="Transparent_Dialog"> &l ...
- SEO高手在扯蛋?
真正的高手SEO你在扯蛋吗?当大家都很会扯的时候,高手扯得肯定比你疼,不是他们 蛋比较敏感,而是他们的确更用力. 当你说我是SEO时,高手肯定说现在我在做的是SEM. 当你说我是SEM时,高手肯定在说 ...