编译可以通过,运行后调用axTTSCtrl1.Speak函数时出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”,我的环境是XPS2+VS2008,搞了半天都没弄懂!请高手给以解答,下面的代码是从VS2002转到VS2008的!
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;using IFLYTTSLib;namespace CSharpSample
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main() 
{
Application.Run(new Form1());
}
private void Form1_Load(object sender, System.EventArgs e)
{
this.comboBox_DFmt.SelectedIndex = 0;
//改为正确的合成系统路径
            //axTTSCtrl1.Executor = "E:\\科大讯飞\\ToolKit\\Bin\\iFlyTTS.dll";
} private void button_Synth_Click(object sender, System.EventArgs e)
{
textBox_Event.Clear(); if( button_Synth.Text == "播放" ) 
{
//设置TTSCtrl的Speed、Pitch、Volume属性
axTTSCtrl1.Speed = int.Parse(textBox_Speed.Text);
axTTSCtrl1.Pitch = int.Parse(textBox_Pitch.Text);
axTTSCtrl1.Volume = int.Parse(textBox_Volume.Text); //设置TTSCtrl的AudioFmt属性
IFLYTTSLib.enAudioFmt eAudio = IFLYTTSLib.enAudioFmt.eAdfDefault;
switch( comboBox_DFmt.SelectedIndex ) 
{
case 1:
eAudio = IFLYTTSLib.enAudioFmt.eAdfPcm8k8b;
break;
case 2:
eAudio = IFLYTTSLib.enAudioFmt.eAdfPcm16k8b;
break;
case 3:
eAudio = IFLYTTSLib.enAudioFmt.eAdfPcm8k16b;
break;
case 4:
eAudio = IFLYTTSLib.enAudioFmt.eAdfPcm16k16b;
break;
case 5:
eAudio = IFLYTTSLib.enAudioFmt.eAdfPcm6k8b;
break;
case 6:
eAudio = IFLYTTSLib.enAudioFmt.eAdfPcm6k16b;
break;
case 0:
default:
break;
}
axTTSCtrl1.AudioDataFmt = eAudio;

//设置SyncMod属性(同步/异步)
axTTSCtrl1.SyncMod = Convert.ToInt32(checkBox_SynMod.Checked); //设置Output属性(音频设备/文件),默认为“#Audio”
if( checkBox_OutPut.Checked ) 
{
axTTSCtrl1.Output = textBox_FileName.Text;
} //调用Speak方法进行合成
axTTSCtrl1.Speak(textBox_syntext.Text,IFLYTTSLib.enSpeakFlags.esfText,1);
}
else
{
//调用Stop方法停止合成
axTTSCtrl1.Stop();
button_Pause.Text = "暂停";
}
} private void button_Pause_Click(object sender, System.EventArgs e)
{
if( button_Pause.Text == "暂停" && Convert.ToBoolean(axTTSCtrl1.Busy)  ) 
{
button_Pause.Text = "继续";
axTTSCtrl1.Pause(); }
else if(  button_Pause.Text == "继续" && Convert.ToBoolean(axTTSCtrl1.Busy) )
{
button_Pause.Text = "暂停";
axTTSCtrl1.Resume();
}
} private void axTTSCtrl1_SpeakStart(object sender, AxIFLYTTSLib._ISpeakEvents_SpeakStartEvent e)
{
textBox_Event.AppendText("合成开始!" + "  用户数据是:" + e.user.ToString() + "\n");
button_Synth.Text = "停止";
} private void axTTSCtrl1_SpeakEnd(object sender, AxIFLYTTSLib._ISpeakEvents_SpeakEndEvent e)
{
textBox_Event.AppendText("合成结束,结束的原因是" + string.Format(e.eReason.ToString()) + "  用户数据是:" + e.user.ToString()  + "\n");
button_Synth.Text = "播放";
} private void axTTSCtrl1_SentenceEnd(object sender, AxIFLYTTSLib._ISpeakEvents_SentenceEndEvent e)
{
textBox_Event.AppendText( "合成结束位置" + string.Format(e.nEndPos.ToString()) +"  用户数据是:" + e.user.ToString() + "\n");
} private void axTTSCtrl1_SentenceStart(object sender, AxIFLYTTSLib._ISpeakEvents_SentenceStartEvent e)
{
textBox_Event.AppendText("合成开始位置" + string.Format(e.nStartPos.ToString()) + "  用户数据是:" + e.user.ToString() + "\n");
} private void axTTSCtrl1_Progress(object sender, AxIFLYTTSLib._ISpeakEvents_ProgressEvent e)
{
textBox_Event.AppendText("当前进度:" + (int)(e.fPercent) +"%" + "  用户数据是:" + e.user.ToString() + "\n");
} private void axTTSCtrl1_ErrorNotify(object sender, AxIFLYTTSLib._ISpeakEvents_ErrorNotifyEvent e)
{
textBox_Event.AppendText("合成出错!错误原因是:" + e.nErrCode);
} private void Form1_Closed(object sender, System.EventArgs e)
{
axTTSCtrl1.Stop();
} }
}

解决方案 »

  1.   

    尝试读取或写入受保护的内存。这通常指示其他内存已损坏? 肯定是参数类型问题。检查是COM那个方法报的错。
      

  2.   

    axTTSCtrl1.Speak(textBox_syntext.Text,IFLYTTSLib.enSpeakFlags.esfText,1);speak如果是你封装的, 就检查封装参数类型,
    如果是厂家封装的, 那你就检查你传入的时候是否符合参数要求。