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的简单的窗口程序的更多相关文章

  1. Win32汇编学习(3):简单的窗口

    这次我们将写一个 Windows 程序,它会在桌面显示一个标准的窗口,以此根据代码来学习如何创建一个简单的窗口. 理论: Windows 程序中,在写图形用户界面时需要调用大量的标准 Windows ...

  2. win32汇编简单实现窗口程序

    .386 .model flat,stdcall option casemap:none ;========================== ;include部分 include windows. ...

  3. (Delphi)第一个Windows 32 API的窗口程序

    program Project1; uses Winapi.Windows, Winapi.messages; {$R *.res} const className = 'MyDelphiWindow ...

  4. Win32编程API 基础篇 -- 2.一个简单的窗口 根据英文教程翻译

    一个简单的窗口 例子:简单的窗口 有时人们在IRC提问,”我应该怎样制作一个窗口”...嗯,这恐怕不是完全这么简单好回答!其实这并不难一旦你明白你在做什么,但在你得到一个可展示的窗口之前还有一些事情需 ...

  5. Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Discuz!

    Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Disc ...

  6. Delphi写的DLL,OCX中多线程一个同步问题

    Delphi写的DLL,OCX中如果使用了TThread.Synchronze(Proc),可能导致线程死锁,原因是无法唤醒EXE中主线程, Synchronze并不会进入EXE主线程消息队列. 下面 ...

  7. 用delphi写多屏幕程序

    http://blog.csdn.net/zyyjc/article/details/6530728 别现在有些POS机是双屏幕的(比如卡西瓦POS机),一个屏幕可以当顾客显示屏用,当闲时也可以显示一 ...

  8. springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务

    springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...

  9. 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

    32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...

随机推荐

  1. 解决chrome下上传文件 返回值带 <pre style="word-wrap:break-word;white-space:prewrap;"></pre>

    解决办法:后台 response.setContentType("text/html");

  2. JavaScript的原型

    //回顾构造函数 function Box(name, age) { this.name = name; //实例属性 this.age = age; this.run = function() { ...

  3. css实现两端对齐的3种方法

    两端对齐在移动端非常见,说到两端对齐,大家并不陌生,在word.powerpoint.outlook等界面导航处,其实都有一个两端对齐(分散对齐)的按钮,平时使用的也不多,我们更习惯与左对齐.居中对齐 ...

  4. PHP 导出 Excell

    Vendor('PHPExcel179.PHPExcel');$objPHPExcel = new PHPExcel(); //创建PHPExcel对象//设置属性$objPHPExcel->g ...

  5. PHP简易计算器方法1

    <?phpheader("content-type:text/html;charset=utf-8");session_start();?><!DOCTYPE h ...

  6. html5介绍 之亮点特性

    html5 兴起- 乔帮助在2010年发布的:关于对flash的思考,提到有了h5放弃 flash   1 富图形,富媒体      2 本地存储     cookie   3 LBS      基于 ...

  7. 一个使用enum实现多态的例子

    下面的写法与直接 使用静态方法而言,可读性.可维护性更强是不是有DSL的感觉.... 当然enum反编译后,的确就是静态方法. /** * Created by MyWorld on 2016/8/3 ...

  8. W5300E01-ARM 交叉编译器(Cross Compiler)用户手册

    W5300E01-ARM是基于W5300的ARM功能测试评估板: 1      简介 当用户的开发环境与目标系统不同时就会用到交叉编译器. 例如,当开发基于ARM的嵌入式系统时,用户就需要在电脑上写出 ...

  9. Unity3d 打包时报错 CommandInvokationFailure: Unable to convert classes into dex format. See the Console for details.

    今天打包带有Android插件的unity3d 项目是,报错CommandInvokationFailure: Unable to convert classes into dex format. S ...

  10. Introducing Regular Expressions 学习笔记

    Introducing Regular Expressions 读书笔记 工具: regexbuddy:http://download.csdn.net/tag/regexbuddy%E7%A0%B4 ...