- 浏览: 4426494 次
- 性别:
- 来自: 湛江
-
博客专栏
-
-
SQLite源码剖析
浏览量:80286
-
-
WIN32汇编语言学习应用...
浏览量:70720
-
-
神奇的perl
浏览量:103908
-
-
lucene等搜索引擎解析...
浏览量:287220
-
-
深入lucene3.5源码...
浏览量:15111
-
-
VB.NET并行与分布式编...
浏览量:68215
-
-
silverlight 5...
浏览量:32473
-
-
算法下午茶系列
浏览量:46225
文章分类
最新评论
-
yoyo837:
counters15 写道目前只支持IE吗?插件的东西是跨浏览 ...
Silverlight 5 轻松开启绚丽的网页3D世界 -
shuiyunbing:
直接在前台导出方式:excel中的单元格样式怎么处理,比如某行 ...
Flex导出Excel -
di1984HIT:
写的很好~
lucene入门-索引网页 -
rjguanwen:
在win7 64位操作系统下,pygtk的Entry无法输入怎 ...
pygtk-entry -
ldl_xz:
http://www.9958.pw/post/php_exc ...
PHPExcel常用方法汇总(转载)
WIN32汇编开发记事本语音阅读工具
一、 引言
Windows系统具有风格一致的华丽图形用户界面、丰富的API函数、设备无关性、多任务等特点而广泛流行。
Win32汇编支持32位Windows API函数的调用,拥有很多高级语言的语法和运算符,编译后的程序执行效率高,占微量系统资源,短小精练,因此WIN32汇编语言非常适合记事本语音阅读工具这类软件的开发。
二、设计思路
汇编语言没有类的概念,只能采用传统的结构化方法进行设计。按软件实现的功能分为以下几个模块:
1、 记事本内容读取
2、 语音阅读文本
3、 消息循环处理
4、 程序的启动与退出
程序开发的难点是前两个模块,笔者进行如下设计:
1、 如何获取记事本内容。首先获取记事本的窗口句柄,然后获得记事本的文本子窗口句柄,最后向子窗口发送WM_GETTEXT消息取得记事本所打开的文本内容。
2、 如何实现语音阅读文本。采用微软的TTS语音引擎实现文本转语音功能, TTS基于COM,因此开发需要使用Microsoft SpeechSDK,直接调用SAPI实现语音朗读,Microsoft SpeechSDK没有相应的汇编语言INC头文件,必须将C的头文件翻译成汇编格式,直接写在代码内,另外COM对象函数遵循严格顺序,不能随意调换列表中函数位置。
该软件人机界面简单,资源文件使用用记事本直接手动编写,读者也可使用VC自带的资源编辑工具编写。
三、代码实现:
(一)程序代码
;程序名:记事本语音阅读工具
;作者:刘兴
;文件名:readtext.asm
;汇编中的注释采用“;”表示,笔者在关健代码上注释其含义。
;汇编中一行代码写不下,用“\”表示续行
;####################################################################
;指定编译选项
.486
.model flat, stdcall
option casemap :none
;####################################################################
;指定使用的头文件
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
include masm32.inc
include ole32.inc
;笔者的MASM32 Version 9.0安装在d盘
include d:\masm32\com\include\oaidl.inc
;####################################################################
;指定使用的库文件
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
includelib masm32.lib
includelib ole32.lib
;####################################################################
;汇编期常量定义
IDC_OK equ 101
IDC_MIN equ 102
IDC_EXIT equ 103
FLAG_PLAY equ 1
FLAG_PAUSE equ 2
FLAG_RESUME equ 3
FLAG_STOP equ 0
SPF_ASYNC equ 1;sapi.h中定义
DIALOG_MAIN equ 1
;####################################################################
;定义ISpVoice的虚函数接口表结构
;接口表由sapi.h取得,将ISpVoiceVtbl的定义改成汇编格式
ISpVoice STRUCT DWORD
QueryInterface comethod3 ?
AddRefcomethod1 ?
Release comethod1 ?
SetNotifySink comethod2 ?
SetNotifyWindowMessage comethod5 ?
SetNotifyCallbackFunction comethod4 ?
SetNotifyCallbackInterface comethod4 ?
SetNotifyWin32Event comethod1 ?
WaitForNotifyEvent comethod1 ?
GetNotifyEventHandle comethod1 ?
SetInterest comethod3 ?
GetEvents comethod4 ?
GetInfo comethod2 ?
SetOutput comethod3 ?
GetOutputObjectToken comethod2 ?
GetOutputStream comethod2 ?
Pause comethod1 ?
Resume comethod1 ?
SetVoice comethod2 ?
GetVoice comethod2 ?
Speak comethod4 ?
SpeakStream comethod4 ?
GetStatus comethod3 ?
Skip comethod4 ?
SetPriority comethod2 ?
GetPriority comethod2 ?
SetAlertBoundary comethod2 ?
GetAlertBoundary comethod2 ?
SetRate comethod2 ?
GetRate comethod2 ?
SetVolume comethod2 ?
GetVolume comethod2 ?
WaitUntilDone comethod2 ?
SetSyncSpeakTimeout comethod2 ?
GetSyncSpeakTimeout comethod2 ?
SpeakCompleteEvent comethod1 ?
IsUISupported comethod5 ?
DisplayUI comethod6 ?
ISpVoice ENDS
;####################################################################
;未初始化数据段
.data?
hWinMain DWORD ?
CommandLine DWORD ?
hInstance DWORD ?
showrect RECT <>
ppVoice DWORD ?
;####################################################################
;已初始化数据段
.data
sznoteclass db "Notepad",0
szplay db "开始",0
szresume db "继续",0
szpause db"暂停",0
szbuffer dw 2000 dup(?)
szmscap db "错误",0
dwflag dd FLAG_STOP;当前的工作状态:停止、开始、暂停、继续
;SpVoice对象的CLSIDT和IID定义,在SDK的相关头文件可以找到
CLSID_SpVoiceGUID<96749377H,3391H,11D2H,\
<9EH,0E3H,00H,0C0H,4FH,79H,73H,96H>>
IID_ISpVoice GUID<6C44DF74H,72B9H,4992H,\
<0A1H,0ECH,0EFH,99H,6EH,04H,22H,0D4H>>
szerrtext db "错误号:"
szerrtextno db 20 dup(?),0
;####################################################################
;函数声明
_speaktext proto :DWORD,:DWORD
;####################################################################
;下面是代码段
.code
;#############################################################
;读取并语音朗读记事本内容函数
;函数主要参数说明 @dwflag:标志参数
_readtext proc @dwflag:DWORD
local hwnd:DWORD
invokeFindWindow,addr sznoteclass,NULL
movhwnd,eax;得到记事本窗口句柄
invokeGetWindow,hwnd,GW_CHILD
movhwnd,eax;得到文本子窗口句柄
;获取文本内容
invoke SendMessage,hwnd,WM_GETTEXT,2000,addr szbuffer
;调用子函数实现文本转语音
invoke _speaktext,addr szbuffer,@dwflag
ret
_readtext endp
;###################################################################
;取得COM接口错误号函数
;根据错误号在SDK的winerror.h中查出错误类型
_geterrno proc szerrhex:DWORD,pszerrtext:DWORD
push eax
invokedw2hex,szerrhex,pszerrtext
pop eax
ret
_geterrno endp
;####################################################################
;窗口过程处理函数
_ProcMain proc uses ebx edx hWnd,uMsg,wParam,lParam
.if uMsg==WM_COMMAND
moveax,wParam
movzxeax,ax
.if eax==IDC_EXIT ;程序退出,释放ppVoice对象
mov eax,ppVoice
movedx,[eax]
invoke(ISpVoice PTR[edx]).Release,ppVoice
callCoUninitialize
invoke EndDialog,hWnd,NULL
.elseif eax==IDC_OK
;通过dwflag变量变化实现开始、停止、暂停功能
;转换,调用SetDlgItemText实现按钮文字的更新
.if dwflag==FLAG_STOP
mov dwflag,FLAG_PLAY
invoke SetDlgItemText,hWnd,IDC_OK,addrszpause .elseif dwflag==FLAG_PAUSE
mov dwflag,FLAG_RESUME
invoke SetDlgItemText,hWnd,IDC_OK,addr szpause
.elseif dwflag==FLAG_RESUME||dwflag==FLAG_PLAY
mov dwflag,FLAG_PAUSE
invoke SetDlgItemText,hWnd,IDC_OK,addrszresume .endif
invoke _readtext,dwflag;调用读取并朗读记事本子函数
.elseif eax==IDC_MIN
invoke ShowWindow,hWnd,SW_MINIMIZE;最小化窗口
.endif
.elseif uMsg==WM_INITDIALOG
;初始化pVoice对象
invoke CoInitialize,NULL
invoke CoCreateInstance,addr CLSID_SpVoice,NULL,CLSCTX_ALL,\
addr IID_ISpVoice,addr ppVoice
.IF_FAILED;如果失败,取得错误号并释放资源
invoke_geterrno,eax,addr szerrtextno
invokeMessageBox,NULL,addr szerrtext,\
addr szmscap,MB_ICONERROR
call CoUninitialize
.endif
;设置语音库为默认语音
mov eax,ppVoice
movedx,[eax]
invoke (ISpVoice PTR[edx]).SetVoice,ppVoice,NULL
;设置语速
mov eax,ppVoice
movedx,[eax]
invoke(ISpVoice PTR[edx]).SetRate,ppVoice,3
.IF_FAILED
invoke _geterrno,eax,addr szerrtextno
invoke MessageBox,NULL,addr szerrtext,addr szmscap,\
MB_ICONERROR
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcMain endp
;####################################################################
;文本转语音子函数
;函数主要参数说明:pszspeakansi:文本地址,@dwflag:标志参数
_speaktext proc uses edx ebxpszspeakansi:DWORD,@dwflag:DWORD
.data
szspeaktextdw 2000 dup(?);要朗读的文本
.code
;将文本转换成宽字符型,一个字符用16位表示,因为可能存在中文字符
invoke lstrlen,pszspeakansi
mov ebx,eax
invokeMultiByteToWideChar,CP_ACP,MB_PRECOMPOSED,\
pszspeakansi,-1,addr szspeaktext,ebx
mov eax,ppVoice
mov edx,[eax]
.if@dwflag==FLAG_PLAY ;播放
invoke (ISpVoice PTR[edx]).Speak,ppVoice,\
addr szspeaktext,SPF_ASYNC,NULL
.elseif@dwflag==FLAG_PAUSE ;暂停
invoke (ISpVoicePTR[edx]).Pause,ppVoice
.elseif @dwflag==FLAG_RESUME ;继续
invoke (ISpVoicePTR[edx]).Resume,ppVoice .endif
.IF_FAILED
invoke _geterrno,eax,addr szerrtextno
invoke MessageBox,NULL,addr szerrtext,\
addr szmscap,MB_ICONERROR
.endif
ret
_speaktext endp
;####################################################################
;主窗口消息循环
_WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
;显示模态对话框
invoke DialogBoxParam,hInst,DIALOG_MAIN,\
NULL,addr _ProcMain,NULL
ret
_WinMain endp
;####################################################################
start:
;程序的入口,控制程序的启动与退出
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke _WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax;退出程序
;####################################################################
;指定入口地址
end start
(二)资源文件
//文件名:readtext.rc
#include <resource.h>
#define IDC_OK 101
#define IDC_MIN 102
#define IDC_EXIT 103
#define DIALOG_MAIN 1
///////////////////////////////////////////////////////////////////////定义图标文件
IDR_MAINFRAME ICON DISCARDABLE "readtext.ico"
/////////////////////////////////////////////////////////////////////
//定义对话框
DIALOG_MAIN DIALOG 0, 0, 320, 50
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "记事本语音阅读器(程序:刘兴)"
FONT 9, "宋体"
//定义子窗口控件
BEGIN
//子窗口总共三个按钮
PUSHBUTTON "开始",IDC_OK,10,20,50,14
PUSHBUTTON "最小化",IDC_MIN,110,20,50,14
PUSHBUTTON "退出",IDC_EXIT,210,20,50,14
END
四、编译生成可执行文件
笔者使用MASM32 Version 9.0做为开发和编译工具,此工具可以在http://www.movsd.com/下载。
编译命令:
ml /c /coff readtext.asm
rc readtext.rc
link /subsystem:windows readtext.obj readtext.res
五、程序运行环境要求
该程序要求WINDOWS操作系统安装了Microsoft Speech SDK,并将中文语音设为默认语音库。
发表评论
-
win下开发跨平台GUI程序的另类选择
2011-05-03 17:21 2251GTK+ ● GTK+的网站:www.gtk. ... -
win32汇编-送消息给其它应用程序
2010-02-20 16:42 29272个函数invoke postmessage,hwnd,msg ... -
WIN32汇编之菜单、加速键、快捷键
2010-02-20 16:38 3189(一)Invoke checkmenuitem,h ... -
WIN32汇编学习应用之defwindowproc
2010-02-20 16:36 2764defwindowproc窗口过程对一些消息的默认处理方式WM ... -
windows中WM_CLOSE消息和WM_DESTORY消息的不同之处
2010-02-20 16:33 24491、WM_CLOSE仅代表用户发出了关闭的指令,但窗口过程可以 ... -
WIN32汇编获取应用程序句柄
2010-02-20 16:32 2248getmodulehandle使用方法invoke getm ... -
WIN32汇编语言学习应用之消息获取
2010-02-20 16:31 1748MSG结构:MSG STURCTHwnd DWORD ?Mes ... -
一个WIN32汇编的完整窗口入门程序的理解与注释
2010-02-20 16:28 3756;WIN32汇编的注释是;,其实WIN32汇编和VC有很多 ... -
汇编中通用寄存器的目的
2010-02-20 16:24 22411、EAX和AX:累加器,所有的I/O指令用它来与外部设备 ... -
汇编几个段
2010-02-17 16:39 4240反汇编后几个段的含义 预定义段 一个WindowsNT ... -
WIN32汇编语言解析
2010-02-17 16:36 2585win32汇编中的sizeof win32汇编中的s ... -
设置与获取窗口标题文本
2010-02-17 16:32 2061获得: CString xx=""; ... -
win32汇编快速入门
2010-02-17 16:31 4687汇编可以开发WINDOWS程序 ... -
WIN32汇编-HELLO,WORLD!
2010-02-17 16:29 4473我们用WIN32汇编构建 ... -
保护模式下段寄存器的作用
2010-02-17 14:39 33261、保护模式一,虽然在寻址上没有分段的限制问题,但对要对一个地 ... -
WIN32汇编-反汇编
2010-02-17 14:33 2816学好WIN32汇编,平时需 ... -
玩转菜单-菜单资源
2010-02-08 17:31 1966菜单资源 WINDOWS程序的菜单通常编译前定义在资 ... -
二进制资源和自定义资源使用定义
2010-02-08 17:29 22161、二进制资源 (1)定义格式: 资源IDRCDA ... -
LISTBOX和LIST CONTROL的项目增加方法
2010-02-08 17:28 54771、LIST CONTROL(report方式): (1)类 ... -
取IP寄存器的当前值
2010-02-08 17:27 1979call $+3 POP CX 把IP寄存器的当前值放 ...
相关推荐
《基于Win32汇编的记事本程序详解》 在计算机编程的世界里,汇编语言作为底层语言,是理解计算机工作原理的重要工具。而Windows操作系统则是全球最广泛使用的桌面系统,其API(应用程序接口)提供了丰富的功能供...
在计算机编程领域,源码是程序设计者用高级语言或低级语言编写的人类可读的代码,而“WIN32汇编写的记事本源码”指的是使用汇编语言实现的一个类似于Windows操作系统内置记事本的应用程序。汇编语言是一种低级编程...
Win32应用程序虽然和其他32位应用程序(例如32位保护模式DOS程序)一样可以使用386汇编语言和保护模式编程,但是Win32应用程序的执行机制与其他32位应用程序有一定的差别,例如消息循环、动态链接等,Win32汇编语言...
总之,"WIN32汇编程序源码级调试_VS2019"涵盖了使用汇编语言开发Win32应用程序的关键技术,包括设置VS2019项目、调用Win32 API、使用MASM汇编器和调试技巧。通过学习和实践,开发者可以提高对计算机底层运作的理解,...
Win32汇编语言-罗云彬.chm Win32汇编语言-罗云彬.chm Win32汇编语言-罗云彬.chm
【标题】: "WIN32汇编语言实现的记事本程序源代码" 【内容详解】 在计算机编程领域,汇编语言是一种低级语言,它直接对应于机器指令,每一条汇编指令通常对应一个CPU的机器码。尽管高级语言如C++、Python等更加...
**win32汇编开发工具包详解** 在计算机科学领域,汇编语言是一种低级编程语言,它直接对应于机器代码,每一行汇编指令都代表着一个或几个特定的CPU操作。win32汇编开发工具包是针对Windows 32位操作系统设计的汇编...
标题 "x86_64-8.1.0-release-win32-seh-rt_v6-rev0.rar" 暗示了这是一个针对x86_64架构的编译器或开发环境的下载包,版本号为8.1.0,并且是针对Windows 32位系统(尽管它本身是64位程序)的,具有结构化异常处理...
学习Win32汇编工具打包,不仅可以提升编程技能,还能深入理解操作系统的工作原理,这对于开发底层软件、优化性能、解决特定问题等都有很大帮助。通过实践这些示例,你可以逐步掌握Win32汇编的使用,以及如何创建和...
win32汇编教程。汇编基础。 本帮助文件由yyc个人整理后出版,内容全摘自网络。版权归实际作者所有。 为了让网友们能更好的学习Win32汇编编程,于是我为大家将网上的资料整理成一个帮助文件。 本帮助文件包括:...
首先,`binutils-esp32ulp-win32`是一个针对ESP32 ULP协处理器的专用编译工具集,它包含了ESP32 ULP汇编器(esp32ulp-elf-as)、链接器(esp32ulp-elf-ld)等组件,是构建ULP程序不可或缺的部分。这个工具包由...
总之,Win32汇编语言集成开发环境为汇编程序员提供了强大的工具,帮助他们更高效地编写、测试和调试Win32平台的汇编代码。无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的编程技能。
Win32汇编语言是计算机科学的一个重要领域,它是一种低级编程语言,直接与Windows操作系统接口进行交互。在深入探讨之前,让我们先明确一点:Win32汇编并不是一个独立的语言,而是指使用Intel x86架构上的汇编语言来...
本文将围绕"汇编语言集成开发环境(win32汇编)"这一主题展开,介绍一款专为汇编程序员设计的高效开发工具环境。这个集成开发环境(IDE)为编写和调试汇编程序提供了便捷的平台,尤其对熟悉VC++6.0编程界面的人来说...
- **MASM汇编器**:Microsoft的MASM(Microsoft Assembler)是必备工具,至少需要6.11版以上以支持Win32汇编。MASM 6.11及更高版本的ML.EXE文件可用于汇编源代码。 - **Win32 SDK**:Software Development Kit提供了...
RadAsm是一款流行的Win32汇编开发工具,它的主要特点和功能包括: 1. **源代码编辑**:RadAsm提供了一个直观的源代码编辑器,支持语法高亮和自动完成,使得编写汇编代码更为便捷。 2. **调试功能**:内置的调试器...
内容索引:VC/C++源码,其它分类,汇编,记事本 WIN32汇编拟Windows XP自带记事本,界面和功能都仿的比较像,未能实现打印功能,拖放文件功能也有待完善。 richEdit控件未实现右键菜单。基本实现所有功能,添加了工具栏...
"xtensa-esp32s2-elf-gcc8_4_0-esp-2021r2-win32.zip"是ESP32-S2开发的关键工具,它为Windows用户提供了一个完整的开发环境。借助这个工具链和ESP-IDF框架,开发者可以高效地进行ESP32-S2的软件开发,实现丰富的...
Iczelion的Win32汇编教程,传说中的经典win32汇编教程
希望多多交流,模拟XP自带记事本,未实现打印功能,拖放文件功能 richEdit控件未实现右键菜单(评论里已有) 实现查找、替换、转到行、等基本功能,添加了工具栏和状态栏,增加颜色功能 (新版本交流请联系我,谢谢)...