首先:这不是Delphi和SAPI的重复.我对"Delphi中的SAPI"主题有一个具体问题.
我在Delphi 2009中使用了优秀的Import Type-Library指南来获取组件面板中的TSpVoice组件.这非常有效.同
var
SpVoice: TSpVoice;
Run Code Online (Sandbox Code Playgroud)
我可以写
SpVoice.Speak('This is an example.', 1);
Run Code Online (Sandbox Code Playgroud)
获得异步音频输出.
第一个问题
根据文档,我可以写
SpVoice.Speak('This is an example.', 0);
Run Code Online (Sandbox Code Playgroud)
获得同步音频输出,但我获得了EZeroDivide异常.为什么?
第二个问题
但更重要的是,我希望能够动态创建SpVoice对象(我认为这被称为"后期绑定"SpVoice对象),部分原因是我的应用程序的所有会话中只有一小部分会使用它,部分是因为我不想假设最终用户系统上存在SAPI服务器.
为此,我试过了
procedure TForm1.FormClick(Sender: TObject);
var
SpVoice: Variant;
begin
SpVoice := CreateOleObject('SAPI.SpVoice');
SpVoice.Speak('this is a test', 0);
end;
Run Code Online (Sandbox Code Playgroud)
显然什么也没做!(将0替换为0可以获得EZeroDivide异常.)
放弃
我是COM/OLE自动化的新手.对于我在这篇文章中所表现出的任何无知或愚蠢,我感到很抱歉......
为了让每个人遇到与我一样的问题,François的视频解释说SAPI/Windows中存在一个错误(某些地方不兼容),这使得以下代码引发了EZeroDivide异常:
procedure TForm1.FormClick(Sender: TObject);
var
SpVoice: variant;
begin
SpVoice := CreateOleObject('SAPI.SpVoice');
SpVoice.Speak('This is a text.');
end;
Run Code Online (Sandbox Code Playgroud)
视频中提供的解决方案是更改FPU控制字:
procedure TForm1.FormClick(Sender: TObject);
var
SpVoice: variant;
SavedCW: Word;
begin
SpVoice := CreateOleObject('SAPI.SpVoice'); …Run Code Online (Sandbox Code Playgroud) 有一个代码:
var
myobject: OleVariant;
begin
myobject := CreateOleObject('SomeNamespace.SomeClass');
end;
Run Code Online (Sandbox Code Playgroud)
此COM对象具有事件(例如OnClick).如何在不导入TLB的情况下连接这些事件?