;运行效果

;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
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

692

被折叠的 条评论
为什么被折叠?



