熟悉使用COleDispatchDriver类作COM 客户的朋友请进

常宁 2002-04-28 08:37:02
我打算用COleDispatchDriver调用windows XP的TTS的COM对象,如何实现?我做了几次都不成功。能不能那位将代码贴出来,谢谢(其实应该很小把,我想应该小于20行)我不想用对话框上添加OCX的方法。
...全文
337 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
常宁 2002-04-29
  • 打赏
  • 举报
回复
谢谢,结!
zxs218 2002-04-29
  • 打赏
  • 举报
回复
因为发音程序是异步执行的,你的程序并没有因为调用Speak方法而等在那儿,也就是说它一调用就结束了,有另外一个线程负责发音。

如果你在函数体内声明,函数一执行结束,对象也就被释放了,那个发音的线程也就随之终止。当然就不可能发音了。

不知这样说你明不明白。
常宁 2002-04-29
  • 打赏
  • 举报
回复
to zxs218(Frank Zhou)
多谢,程序可以发音了,但是能不能说明ITextToSpeech tts 不能在函数范围内声明?我不理解,我的不出声的问题根源就在这里。解答了这个问题,这100分就是你的了:)能不能告诉我你的QQ号码?我的是28246466
zxs218 2002-04-28
  • 打赏
  • 举报
回复
用Regedit查看
找到HKEY_CLASSES_ROOT中找到TextToSpeech.TextToSpeech

然后看后面的版本号“1”

在我的机器中就是1,

不加入版本号是会出错的,比如"TextToSpeech.TextToSpeech"
错误就是Invalid Class String。
使用GUID也是可以的,我查一下等会儿给你。
常宁 2002-04-28
  • 打赏
  • 举报
回复
另外还有,有没有办法不用ProgId而用GUID?
我不知道如何在CreateDispatch函数中填入这个参数
常宁 2002-04-28
  • 打赏
  • 举报
回复
你的代码,在我这里显现错误信息Invalid class string
如何得到ProgId?我用WindowsXP英文版。
其实我想问的正是这个,为什么我这里会显示Invalid Class String,而且得到的ProgId当参数填入的时候,显示的还是这个?
zxs218 2002-04-28
  • 打赏
  • 举报
回复
我在Windows 2000下测试通过,使用的是Microsoft Voice Text对象。
文件是C:\WINNT\System32\VText.dll

在InitInstance函数中加入
AfxOleInit();

导入的文件为vtext.h

#include "vtext.h"

/////////////////////////////////////////////////////////////////////////////
// CTestOleAutoDlg dialog

class CTestOleAutoDlg : public CDialog
{
// Construction
public:
CTestOleAutoDlg(CWnd* pParent = NULL); // standard constructor

ITextToSpeech tts; // 声明为类成员。

// Dialog Data
//{{AFX_DATA(CTestOleAutoDlg)
enum { IDD = IDD_TESTOLEAUTO_DIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTestOleAutoDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
HICON m_hIcon;

// Generated message map functions
//{{AFX_MSG(CTestOleAutoDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButton1();
afx_msg void OnButton2();
afx_msg void OnButton3();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

// 创建
void CTestOleAutoDlg::OnButton1()
{
tts.CreateDispatch("TextToSpeech.TextToSpeech.1");
}
// 讲
void CTestOleAutoDlg::OnButton2()
{
tts.Speak(_T("I am a hero"));
}

// 释放
void CTestOleAutoDlg::OnButton3()
{
tts.ReleaseDispatch();
}

不能放在一起,否则声音还没有播放,对象就已经被释放了。
zxs218 2002-04-28
  • 打赏
  • 举报
回复
关注
常宁 2002-04-28
  • 打赏
  • 举报
回复
希望大家踊跃发言,分数不够我可以继续加,其他的方式也好,比如#import方式,API方式也可以,但是最好用COleDispatchDriver方式
zxs218 2002-04-28
  • 打赏
  • 举报
回复
ITextToSpeech tts
不能在函数范围内声明。
zxs218 2002-04-28
  • 打赏
  • 举报
回复
必须声明一个类范围的对象 ITextToSpeech tts;

tts.CreateDispatch("TextToSpeech.TextToSpeech.1");
tts.ReleaseDispatch();
不能放在一起,否则声音还没有播放,对象就已经被释放了。

看看会不会是这个问题?
dyw 2002-04-28
  • 打赏
  • 举报
回复
COleDispatchDriver m_app;

// Check to see if you've already started the server.
if(m_app.m_lpDispatch != NULL) {
AfxMessageBox("Server already started.");
return;
}
if(!m_app.CreateDispatch("Excel.Application", &e)) {
sprintf(buf, "Error on CreateDispatch(): %ld (%08lx)",
e.m_sc, e.m_sc);
AfxMessageBox(buf, MB_SETFOREGROUND);
return;
}

以上代码来自MSDN:
HOWTO: Catch Microsoft Excel Application Events Using VC++
ID: Q186427
常宁 2002-04-28
  • 打赏
  • 举报
回复
另外用UUID有些COM对象报告说对象没有注册?搞不懂,BCB可以调用
常宁 2002-04-28
  • 打赏
  • 举报
回复
谢谢楼上的,现在用你的uuid方式不报那个错误了。但是还是不好用,没有声音!可能是什么情况
zxs218 2002-04-28
  • 打赏
  • 举报
回复
typelib 可以通过microsoft提供的ole view工具,打开你使用的DLL文件或OLB或TLB文件。
zxs218 2002-04-28
  • 打赏
  • 举报
回复
可以这样:
#include "Rpcdce.h"

包含Rpcrt4.lib库。

"2398E32F-5C6E-11D1-8C65-0060081841DE"
使用的是ClassUUID
即tlb文件中的:
[
uuid(2398E32F-5C6E-11D1-8C65-0060081841DE),
helpstring("Microsoft Voice Text Class")
]
coclass TextToSpeech {
[default] interface ITextToSpeech;
[default, source] dispinterface _TextToSpeechEvents;
};

代码如下:

UUID uuid;
UuidFromString((unsigned char *)"2398E32F-5C6E-11D1-8C65-0060081841DE", &uuid);

tts.CreateDispatch(uuid);

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧