熟悉使用COleDispatchDriver类作COM 客户的朋友请进 希望大家踊跃发言,分数不够我可以继续加,其他的方式也好,比如#import方式,API方式也可以,但是最好用COleDispatchDriver方式 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我在Windows 2000下测试通过,使用的是Microsoft Voice Text对象。文件是C:\WINNT\System32\VText.dll在InitInstance函数中加入AfxOleInit();导入的文件为vtext.h#include "vtext.h"/////////////////////////////////////////////////////////////////////////////// CTestOleAutoDlg dialogclass CTestOleAutoDlg : public CDialog{// Constructionpublic: 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// Implementationprotected: 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(); }不能放在一起,否则声音还没有播放,对象就已经被释放了。 你的代码,在我这里显现错误信息Invalid class string如何得到ProgId?我用WindowsXP英文版。其实我想问的正是这个,为什么我这里会显示Invalid Class String,而且得到的ProgId当参数填入的时候,显示的还是这个? 另外还有,有没有办法不用ProgId而用GUID?我不知道如何在CreateDispatch函数中填入这个参数 用Regedit查看找到HKEY_CLASSES_ROOT中找到TextToSpeech.TextToSpeech然后看后面的版本号“1”在我的机器中就是1,不加入版本号是会出错的,比如"TextToSpeech.TextToSpeech"错误就是Invalid Class String。使用GUID也是可以的,我查一下等会儿给你。 可以这样:#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); typelib 可以通过microsoft提供的ole view工具,打开你使用的DLL文件或OLB或TLB文件。 谢谢楼上的,现在用你的uuid方式不报那个错误了。但是还是不好用,没有声音!可能是什么情况 另外用UUID有些COM对象报告说对象没有注册?搞不懂,BCB可以调用 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 必须声明一个类范围的对象 ITextToSpeech tts;tts.CreateDispatch("TextToSpeech.TextToSpeech.1");tts.ReleaseDispatch();不能放在一起,否则声音还没有播放,对象就已经被释放了。看看会不会是这个问题? ITextToSpeech tts不能在函数范围内声明。 to zxs218(Frank Zhou)多谢,程序可以发音了,但是能不能说明ITextToSpeech tts 不能在函数范围内声明?我不理解,我的不出声的问题根源就在这里。解答了这个问题,这100分就是你的了:)能不能告诉我你的QQ号码?我的是28246466 因为发音程序是异步执行的,你的程序并没有因为调用Speak方法而等在那儿,也就是说它一调用就结束了,有另外一个线程负责发音。如果你在函数体内声明,函数一执行结束,对象也就被释放了,那个发音的线程也就随之终止。当然就不可能发音了。不知这样说你明不明白。 CPaintDC dc(this)是什么意思? 一个奇怪的问题,有经验者来看看。。。 重绘了Button,拉伸后位图就乱了,怎么回事 OpenGL中如何隐藏部分元素 急!MFC如何屏CListBox蔽鼠标滚轮消息! 大家发表一下看法吧(散分) 如何确定一个文件是否存在? Violet418 前来领分 请问各位神仙,下面的北大计算机基础题怎么复习?! 怎么去掉客户区的厚厚的边框,让客户区看起来就像没有边框? 如何将CString的变量转变成LPBYTE类型的? 如何获取一个按扭控件的坐标(位置)?
文件是C:\WINNT\System32\VText.dll在InitInstance函数中加入
AfxOleInit();导入的文件为vtext.h#include "vtext.h"/////////////////////////////////////////////////////////////////////////////
// CTestOleAutoDlg dialogclass 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();
}不能放在一起,否则声音还没有播放,对象就已经被释放了。
如何得到ProgId?我用WindowsXP英文版。
其实我想问的正是这个,为什么我这里会显示Invalid Class String,而且得到的ProgId当参数填入的时候,显示的还是这个?
我不知道如何在CreateDispatch函数中填入这个参数
找到HKEY_CLASSES_ROOT中找到TextToSpeech.TextToSpeech然后看后面的版本号“1”在我的机器中就是1,不加入版本号是会出错的,比如"TextToSpeech.TextToSpeech"
错误就是Invalid Class String。
使用GUID也是可以的,我查一下等会儿给你。
#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);
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
tts.ReleaseDispatch();
不能放在一起,否则声音还没有播放,对象就已经被释放了。看看会不会是这个问题?
不能在函数范围内声明。
多谢,程序可以发音了,但是能不能说明ITextToSpeech tts 不能在函数范围内声明?我不理解,我的不出声的问题根源就在这里。解答了这个问题,这100分就是你的了:)能不能告诉我你的QQ号码?我的是28246466