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. 用Struts2标签实现Map的迭代

    最近在做一个论坛,论坛通常分为几个主版块,每一个主版块下面又有几个子版块. 想不出更好的展现方式,最终采用了如下的方法来实现: 用一个Map,HashMap或者Treemap承载之.一个子版块名字对应 ...

  2. SPL的基本使用

    SPL是Standard PHP Library(PHP标准库)的缩写. 根据官方定义,它是"a collection of interfaces and classes that are ...

  3. Android ListView滑动底部自动加载更多

    直接上代码: // lv = (ListView) findViewById(R.id.lv); // // for(int i = 0;i < 50;i++){ // ls.add(" ...

  4. C#性能优化实践 资料整理

    缓存(Cache)是性能优化中最常用的优化手段.适用的情况是频繁的获取一些数据,而每次获取这些数据需要的时间比较长.这时,第一次获取的时候会用正常的方法,并且在获取之后把数据缓存下来.之后就使用缓存的 ...

  5. 计时器中qq上的一个功能,延时作用

    在qq主页面板上的最上方有自己的用户名,往用户名上移动会出现一个大框,往大框中移动,大框不会消失,如果离开大框或者姓名,大框就会消失,这一功能用到display:none的效果还有就是计时器的延时功能 ...

  6. SQL字符型字段按数字型字段排序实现方法(转)

    由于是按字母顺序排列,所以123排在了2的前面,显然不符合我们的要求,那么怎样才能按照我们预想的数字顺序排序呢 ORDER BY `meta_value`   那么按得分排序得到的结果可能是:1101 ...

  7. Python下的机器学习工具sklearn--数据预处理

    1.数据标准化(Standardization or Mean Removal and Variance Scaling) 进行标准化缩放的数据均值为0,具有单位方差. from sklearn im ...

  8. CSS自学笔记(10):CSS3盒子模型

    CSS3为CSS技术的升级版本.最新版本. 就CSS而言,它是一个模块,是一个庞大而又复杂的模块,但是在CSS3中,将这一个庞大的模块分解为一个个容易理解的同时又很精简的小模块,同时CSS3中又添加了 ...

  9. 使用SndPlaySound从内存中播放WAV

    有些时候,我们写的程序需要播放音乐,一般大家会采用以下几种方式:1.把音乐文件放置在某个特定的目录,例如Sound,WAV,Music供程序读取播放:2.使用资源来存放音乐.有些人估计也是使用这个方法 ...

  10. VB.NET让webbrowser控件中JS脚本错误最新方法(2013-09-16)

    最近也是在项目中遇到了webbrowser控件中想关闭JS脚本错误窗口的问题,所以经过多次测试,终于用一段高效实用的代码完美解决webbrowser控件中JS脚本错误窗口关闭的问题. 通过创建一个子线 ...