希望大家踊跃发言,分数不够我可以继续加,其他的方式也好,比如#import方式,API方式也可以,但是最好用COleDispatchDriver方式

解决方案 »

  1.   

    我在Windows 2000下测试通过,使用的是Microsoft Voice Text对象。
    文件是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();
    }不能放在一起,否则声音还没有播放,对象就已经被释放了。
      

  2.   

    你的代码,在我这里显现错误信息Invalid class string
    如何得到ProgId?我用WindowsXP英文版。
    其实我想问的正是这个,为什么我这里会显示Invalid Class String,而且得到的ProgId当参数填入的时候,显示的还是这个?
      

  3.   

    另外还有,有没有办法不用ProgId而用GUID?
    我不知道如何在CreateDispatch函数中填入这个参数
      

  4.   

    用Regedit查看
    找到HKEY_CLASSES_ROOT中找到TextToSpeech.TextToSpeech然后看后面的版本号“1”在我的机器中就是1,不加入版本号是会出错的,比如"TextToSpeech.TextToSpeech"
    错误就是Invalid Class String。
    使用GUID也是可以的,我查一下等会儿给你。
      

  5.   

    可以这样:
    #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);
      

  6.   

    typelib 可以通过microsoft提供的ole view工具,打开你使用的DLL文件或OLB或TLB文件。
      

  7.   

    谢谢楼上的,现在用你的uuid方式不报那个错误了。但是还是不好用,没有声音!可能是什么情况
      

  8.   

    另外用UUID有些COM对象报告说对象没有注册?搞不懂,BCB可以调用
      

  9.   

    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 
      

  10.   

    必须声明一个类范围的对象 ITextToSpeech tts;tts.CreateDispatch("TextToSpeech.TextToSpeech.1");
    tts.ReleaseDispatch();
    不能放在一起,否则声音还没有播放,对象就已经被释放了。看看会不会是这个问题?
      

  11.   

    ITextToSpeech tts
    不能在函数范围内声明。
      

  12.   

    to  zxs218(Frank Zhou)
    多谢,程序可以发音了,但是能不能说明ITextToSpeech tts 不能在函数范围内声明?我不理解,我的不出声的问题根源就在这里。解答了这个问题,这100分就是你的了:)能不能告诉我你的QQ号码?我的是28246466
      

  13.   

    因为发音程序是异步执行的,你的程序并没有因为调用Speak方法而等在那儿,也就是说它一调用就结束了,有另外一个线程负责发音。如果你在函数体内声明,函数一执行结束,对象也就被释放了,那个发音的线程也就随之终止。当然就不可能发音了。不知这样说你明不明白。