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. 代码编辑器的最终选择Sublime Text 2

    对于程序员,不是每一种语言都有很好的代码编辑器,VS这样的编辑环境+编译器也不能适合所有的语言,同时VS占用内存量很大,开几个VS,计算机就开始有点吃不消了.所以简便的代码编辑器很重要. 再Windo ...

  2. matlab求方差,均值,均方差,协方差的函数

    1. 均值 数学定义: Matlab函数:mean >>X=[1,2,3] >>mean(X)=2 如果X是一个矩阵,则其均值是一个向量组.mean(X,1)为列向量的均值,m ...

  3. jquery与ajax的应用

    1.编写第一个Ajax的例子,先来看一下传统的JavaScript实现的ajax例子. 首先在前台页面中书写HTML代码. <input type="button" valu ...

  4. ES6新特性-----变量和字符串

    一.变量 1. LET 我们都习惯用var 来声明变量,现在还可以用let来声明变量,两者的主要区别是作用域:var声明的变量作用域为包围它的函数,而let声明的变量作用域仅在它所在的块中.(在ES5 ...

  5. JavaScript初学者应知的24条最佳实践(译)

    原文:24 JavaScript Best Practices for Beginners 译者:youngsterxyf (注:阅读原文的时候没有注意发布日期,觉得不错就翻译了,翻译到JSON.pa ...

  6. 异步方式向WPF ListBox控件中一条一条添加记录

    向ListBox绑定数据源时,如果数据量过大,可能会使得程序卡死,这是就需要一条一条的向ListBox的数据源中添加记录了,下面是个小Demo: 1.前台代码,就是一个ListBox控件 <Wi ...

  7. ecshop的模板文件中如何判断用户是否登录

    ecshop中对于smarty的运用和改造有很大的值得借鉴的地方,在dwt模板文件中可以直接判断用户是否登录,现在有规定,凡是只展示不销售的电商平台,一律不得展示商品价格,但可以在用户登录后显示. & ...

  8. javascript第十二课array数组

    数组的声明方式: var add=new array(元素1,元素2,元素3......); 推荐的数组声明方式: var add=[元素1,元素2,元素3,元素4....]; 数组遍历方式: 循环遍 ...

  9. [ACM] hdu 1003 Max Sum(最大子段和模型)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  10. UC浏览器开发者版调试手机页面

    1 关于RI 目前,在手机上使用浏览器访问网页,无法便捷地进行网页语言调试.手机屏幕相对较小且操作不便,直接在手机上进行网页数据调试不太现实. 因此,我们使用技术将手机网页调试信息分离,实现一种能在大 ...