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窗口程序 首 ...
随机推荐
- golang Rsa
package models import ( "crypto/rand" "crypto/rsa" "crypto/x509" " ...
- jquery ajax后台向前台传list 前台用jquery $.each遍历list
$.ajax({ type: 'post', url: xxx.action', dataType: 'text', success: function(data){ var dataObj=eval ...
- linux 驱动模块 内核编译环境
目录(?)[+] Linux设备驱动Hello World程序介绍 如何编写一个简单的linux内核模块和设备驱动程序.我将学习到如何在内核模式下以三种不同的方式来打印hello world,这三种方 ...
- (asp.net MVC学习)System.Web.Mvc.HtmlHelper学习及使用
在ASP.NET MVC框架中没有了自己的控件,页面显示完全就回到了写html代码的年代.还好在asp.net mvc框架中也有自带的HtmlHelper和UrlHelper两个帮助类.另外在MvcC ...
- jQuery验证控件(转载)
转自:http://www.cnblogs.com/hejunrex/archive/2011/11/17/2252193.html 官网地址:http://bassistance.de/jquery ...
- WPF Bug清单之(13)——应该出现却没有出现的ListView水平滚动条
转载地址:http://www.cnblogs.com/nankezhishi/archive/2010/03/17/wpfbug13.html 我们知道ListView在内容超出控件本身范围时,默认 ...
- 转载文章:Windows Azure 基础结构服务上的 Microsoft Dynamics NAV 和 Microsoft Dynamics GP!
Windows Azure 基础结构服务(虚拟机和虚拟网络)可提供按需基础结构,该基础结构可进行伸缩以适应不断变化的业务需求.无论您是在虚拟机中创建新应用程序,还是运行现有应用程序,我们都将按分钟收费 ...
- NPOI操作EXCEL--设置密码及设置只读
有时,我们可能需要某些单元格只读,如在做模板时,模板中的数据是不能随意让别人改的.在Excel中,可以通过“审阅->保护工作表”来完成,如下图: 那么,在NPOI中有没有办法通过编码的 ...
- LightOJ 1085(树状数组+离散化+DP,线段树)
All Possible Increasing Subsequences Time Limit:3000MS Memory Limit:65536KB 64bit IO Format: ...
- C++游戏编程(一开篇)
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7318264 作者:毛星云 邮箱: h ...