win32汇编环境,对线程的创建与操作示例二

;运行效果

;win32汇编环境,对线程的创建与操作示例二
;本文主要是实现用CreateThread创建线程时,如何把参数传入进去
;以下举3个例子说明,如何把数值、字符串和自定义结构传入线程之中
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
include    windows.inc 
include    user32.inc 
include    kernel32.inc 
includelib user32.lib 
includelib kernel32.lib 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自定义函数声明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD   ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
.data 
DlgName      db "MyDialog",0 

szCaption    db "提示",0
szFormat01   db "现在的值是 %d",0

szCheshi01   db "DEF",0

A_student struct                          ;定义1个未初始化的结构,包含2个成员,分别是1个4字节值,1个20字节的字符串
   m_A            DWORD    ?                              
   m_B            BYTE     20    DUP(?)                                     
A_student ends

hData01 A_student <>                      ;定义1个A_student结构变量hData01,未初始化

.data? 
hInstance HINSTANCE     ? 
hWinMain    dd    ?
hThreadID01     dd      ?                 ;线程句柄,可用来结束线程,判断线程还在不在等
hThreadID02     dd      ?
hThreadID03     dd      ?

hCount          dd      ?

szName          BYTE     30    DUP(?)     ;定义1个未初化的30字节的字符串
.const 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    equ 1000    ;图标 
IDB01       equ 11      ;按钮控件标识符 
IDB02       equ 12 
IDB03       equ 13  
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code 
start:     
        invoke GetModuleHandle, NULL     
        mov    hInstance,eax     
        invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL     
        invoke ExitProcess,eax 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   
;线程函数_Athread,功能是把传入的参数增1,并弹出提示窗口
_AthreadPro Proc A:DWORD      
        LOCAL   @szBuffer[256]:byte
        pushad                                            ;运行前建议先保存所有的寄存器值,退出时恢复。因为代码一多,用的寄存器就多了,然后忘了什么跟什么了     
        mov eax,A
        inc eax
        mov A,eax
        invoke wsprintf,addr @szBuffer,addr szFormat01,A
     invoke  MessageBox,NULL,addr @szBuffer,addr szCaption,MB_OK     
    popad    
        ret
_AthreadPro Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;线程函数_Bthread,功能是把传入的字符串参数显示出来
_BthreadPro Proc A:DWORD        
        pushad  
        
        mov esi, A
     invoke  MessageBox,NULL,esi,addr szCaption,MB_OK 
         
    popad    
        ret
_BthreadPro Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;线程函数_CthreadPro,功能使用传入进来的结构中的某个成员值
_CthreadPro Proc A:DWORD         
        pushad  
        
        mov esi, A
        assume  esi:ptr A_student                                                                        ;让esi指向A_student结构
     invoke  MessageBox,NULL,addr [esi].m_B,addr szCaption,MB_OK                                      ;显示结构变量hData01中m_B的值,就是字符串"123"    
     assume  esi:nothing
         
    popad    
        ret
_CthreadPro Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM  

       .if      uMsg == WM_INITDIALOG                 
                        invoke    LoadIcon,hInstance,ICO_MAIN           
                        invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax 
        .elseif uMsg == WM_COMMAND  
                mov eax,wParam        
                .if     eax == IDB01
                        mov hCount,1
                        invoke    CreateThread,NULL,0,offset _AthreadPro,hCount,NULL,addr hThreadID01       ;创建线程,同时把hCount当参数传进线程里,这个时候是hCount是1                                                                                                                                   
                .elseif eax == IDB02
                        mov byte ptr [szName],"A"                                                         ;让字符串szName的内容是"ABC"
                        mov byte ptr [szName+1],"B"
                        mov byte ptr [szName+2],"C"
                        mov byte ptr [szName+3],0

                        invoke    CreateThread,NULL,0,offset _BthreadPro,addr szName,NULL,addr hThreadID02

                .elseif eax == IDB03                                     
                        invoke  lstrcpy,addr hData01.m_B,addr szCheshi01                                  ;给结构变量hData01的成员m_B赋值为字符串"DEF"
                        invoke    CreateThread,NULL,0,offset _CthreadPro,addr hData01,NULL,addr hThreadID03 ;把hData01的地址传进线程里面去        
                .endif                      
        .elseif uMsg == WM_CLOSE 
                        invoke    CloseHandle,hThreadID01                                                   ;退出程序前关闭线程   
                        invoke    CloseHandle,hThreadID02   
                        invoke    CloseHandle,hThreadID03     
                        invoke  EndDialog, hWnd,NULL        
        .else                
                mov eax,FALSE                 
                ret                 
        .endif                 
        mov eax,TRUE         
        ret 
DlgProc endp 

end start 

;下面为rc文件内容
#include "resource.h"              //提示缺少该文件,可以在资源里下载
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define    ICO_MAIN        1000    //图标 
#define    IDB01           11 
#define    IDB02           12  
#define    IDB03           13  
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    ICON        "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义对话框
MyDialog DIALOG 10, 10, 140, 80 
STYLE  DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK 
CAPTION "对话框程序模版"
FONT 11, "宋体"
BEGIN 
        PUSHBUTTON      "把整数参数传入线程", IDB01,  10,10,120,14 
        PUSHBUTTON      "字符串指针参数传入线程", IDB02,  10,30,120,14   
        PUSHBUTTON      "结构指针参数传入线程", IDB03,  10,50,120,14                                          
END 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一品人家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值