找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4347|回复: 1

【汇编】汇编写的SpVoice的Demo,COM类的调用例子

[复制链接]
发表于 2015-8-5 01:00:50 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
其实和这个帖子差不多,就是说句话而已。
然而这是汇编的。这对于学习汇编的人有很大帮助哦。
  1. ;导出符号
  2. global _start

  3. ;导入API
  4. extern __imp__CoInitialize@4
  5. extern __imp__CoCreateInstance@20
  6. extern __imp__MessageBoxA@16
  7. extern __imp__ExitProcess@4

  8. ;SpVoice的虚表
  9. struc ISpVoice_Vtbl
  10. ;IUnknown
  11.         .QueryInterface                                resd 1
  12.         .AddRef                                                resd 1
  13.         .Release                                        resd 1
  14. ;ISpNotifySource
  15.         .SetNotifySink              resd 1
  16.         .SetNotifyWindowMessage     resd 1
  17.         .SetNotifyCallbackFunction  resd 1
  18.         .SetNotifyCallbackInterface        resd 1
  19.         .SetNotifyWin32Event        resd 1
  20.         .WaitForNotifyEvent         resd 1
  21.         .GetNotifyEventHandle       resd 1
  22. ;ISpEventSource
  23.         .SetInterest                resd 1
  24.         .GetEvents                  resd 1
  25.         .GetInfo                    resd 1
  26. ;ISpVoice
  27.         .SetOutput                                        resd 1
  28.         .GetOutputObjectToken                resd 1
  29.         .GetOutputStream                        resd 1
  30.         .Pause                                                resd 1
  31.         .Resume                                                resd 1
  32.         .SetVoice                                        resd 1
  33.         .GetVoice                                        resd 1
  34.         .Speak                                                resd 1
  35.         .SpeakStream                                resd 1
  36.         .GetStatus                                        resd 1
  37.         .Skip                                                resd 1
  38.         .SetPriority                                resd 1
  39.         .GetPriority                                resd 1
  40.         .SetAlertBoundary                        resd 1
  41.         .GetAlertBoundary                        resd 1
  42.         .SetRate                                        resd 1
  43.         .GetRate                                        resd 1
  44.         .SetVolume                                        resd 1
  45.         .GetVolume                                        resd 1
  46.         .WaitUntilDone                                resd 1
  47.         .SetSyncSpeakTimeout                resd 1
  48.         .GetSyncSpeakTimeout                resd 1
  49.         .SpeakCompleteEvent                        resd 1
  50.         .IsUISupported                                resd 1
  51.         .DisplayUI                                        resd 1
  52. endstruc

  53. segment .text

  54. ;==============================================================================
  55. ;函数:_start
  56. ;描述:程序入口点
  57. ;------------------------------------------------------------------------------
  58. _start:

  59. ;//初始化COM
  60. ;if(FAILED(hr=CoInitialize(NULL)))
  61. ;{
  62. ;        MessageBox(NULL,"初始化COM失败。",NULL,MB_OK);
  63. ;        return 1;
  64. ;}
  65. push 0
  66. call [__imp__CoInitialize@4]
  67. cmp eax,0
  68. jge .initsuccess
  69. push 0
  70. push 0
  71. push szInitComFailed
  72. push 0
  73. call [__imp__MessageBoxA@16]
  74. jmp .Failed
  75. .initsuccess:

  76. ;ISpVoice*Voice;
  77. ;if(FAILED(hr=CoCreateInstance(CLSID_SpVoice,NULL,CLSCTX_INPROC_SERVER,IID_ISpVoice,(LPVOID*)&Voice)))
  78. ;{
  79. ;        MessageBox(NULL,"创建ISpVoice对象失败。",NULL,MB_OK);
  80. ;        return 1;
  81. ;}
  82. push _pSpVoice
  83. push _IID_ISpVoice
  84. push 1                                ;CLSCTX_INPROC_SERVER
  85. push 0
  86. push _CLSID_SpVoice
  87. call [__imp__CoCreateInstance@20]
  88. cmp eax,0
  89. jge .createsuccess
  90. push 0
  91. push 0
  92. push szCreateObjFailed
  93. push 0
  94. call [__imp__MessageBoxA@16]
  95. jmp .Failed
  96. .createsuccess:

  97. ;Voice->Speak(TEXT("Hello World. 然而并没有什么卵用。"),SVSFDefault,NULL);
  98. push 0
  99. push SVSFDefault
  100. push szSpeak
  101. mov edx,[_pSpVoice]
  102. push edx
  103. mov eax,[edx]
  104. call[eax+ISpVoice_Vtbl.Speak]

  105. ;Voice->Release();
  106. mov edx,[_pSpVoice]
  107. push edx
  108. mov eax,[edx]
  109. call[eax+ISpVoice_Vtbl.Release]

  110. xor eax,eax
  111. push eax
  112. call[__imp__ExitProcess@4]
  113. .Failed:
  114. mov eax,1
  115. push eax
  116. call[__imp__ExitProcess@4]

  117. ;数据段
  118. segment .data
  119. _pSpVoice dd 0;ISpVoice*pSpVoice=NULL;

  120. _CLSID_SpVoice:
  121. dd 0x96749377
  122. dw 0x3391,0x11D2
  123. db 0x9E,0xE3,0x00,0xC0,0x4F,0x79,0x73,0x96

  124. _IID_ISpVoice:
  125. dd 0x6C44DF74
  126. dw 0x72B9,0x4992
  127. db 0xA1,0xEC,0xEF,0x99,0x6E,0x04,0x22,0xD4

  128. szInitComFailed db "初始化COM失败。",0
  129. szCreateObjFailed db "创建ISpVoice对象失败。",0
  130. szSpeak:;"Hello World. 然而并没有什么卵用。",0
  131. db 0x48,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x20,0x00,0x57,0x00,0x6f,0x00
  132. db 0x72,0x00,0x6c,0x00,0x64,0x00,0x2e,0x00,0x20,0x00,0x36,0x71,0x0c,0x80,0x76,0x5e
  133. db 0xa1,0x6c,0x09,0x67,0xc0,0x4e,0x48,0x4e,0x75,0x53,0x28,0x75,0x02,0x30,0x00,0x00

  134. SPF_DEFAULT                                equ        0
  135. SPF_ASYNC                                equ        (1<<0)
  136. SPF_PURGEBEFORESPEAK        equ        (1<<1)
  137. SPF_IS_FILENAME                        equ        (1<<2)
  138. SPF_IS_XML                                equ        (1<<3)
  139. SPF_IS_NOT_XML                        equ        (1<<4)
  140. SPF_PERSIST_XML                        equ        (1<<5)
  141. SPF_NLP_SPEAK_PUNC                equ        (1<<6)
  142. SPF_PARSE_SAPI                        equ        (1<<7)
  143. SPF_PARSE_SSML                        equ        (1<<8)
  144. SPF_PARSE_AUTODETECT        equ        0
  145. SPF_NLP_MASK                        equ        SPF_NLP_SPEAK_PUNC
  146. SPF_PARSE_MASK                        equ        (SPF_PARSE_SAPI|SPF_PARSE_SSML)
  147. SPF_VOICE_MASK                        equ        (((((((SPF_ASYNC|SPF_PURGEBEFORESPEAK)|SPF_IS_FILENAME)|SPF_IS_XML)|SPF_IS_NOT_XML)|SPF_NLP_MASK)|SPF_PERSIST_XML)|SPF_PARSE_MASK)
  148. SPF_UNUSED_FLAGS                equ        (~SPF_VOICE_MASK)

  149. SVSFDefault                                equ        SPF_DEFAULT
  150. SVSFlagsAsync                        equ        SPF_ASYNC
  151. SVSFPurgeBeforeSpeak        equ        SPF_PURGEBEFORESPEAK
  152. SVSFIsFilename                        equ        SPF_IS_FILENAME
  153. SVSFIsXML                                equ        SPF_IS_XML
  154. SVSFIsNotXML                        equ        SPF_IS_NOT_XML
  155. SVSFPersistXML                        equ        SPF_PERSIST_XML
  156. SVSFNLPSpeakPunc                equ        SPF_NLP_SPEAK_PUNC
  157. SVSFParseSapi                        equ        SPF_PARSE_SAPI
  158. SVSFParseSsml                        equ        SPF_PARSE_SSML
  159. SVSFParseAutodetect                equ        SPF_PARSE_AUTODETECT
  160. SVSFNLPMask                                equ        SPF_NLP_MASK
  161. SVSFParseMask                        equ        SPF_PARSE_MASK
  162. SVSFVoiceMask                        equ        SPF_VOICE_MASK
  163. SVSFUnusedFlags                        equ        SPF_UNUSED_FLAGS
复制代码
20150805005820.png
编译命令:
  1. nasm -f win32 COM_SpVoice.asm -o COM_SpVoice.obj
  2. @pause
  3. link /ENTRY:start /MACHINE:X86 /NOLOGO /OUT:COM_SpVoice.exe /RELEASE /SUBSYSTEM:WINDOWS /VERSION:1.0 COM_SpVoice.obj kernel32.lib user32.lib ole32.lib
  4. @pause
复制代码
20150805005955.png

BIN: COM_SpVoice.exe (3 KB, 下载次数: 6)
SRC: spvoice.7z (412.43 KB, 下载次数: 6)
回复

使用道具 举报

发表于 2015-8-5 10:43:36 | 显示全部楼层
来抢个沙发,支持楼主; LINK 感觉有点儿麻烦~
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-24 10:15 , Processed in 0.036825 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表