检测到 PInvokeStackImbalance,懂的来

yang448246711 2010-11-09 04:09:48
检测到 PInvokeStackImbalance
Message: 对 PInvoke 函数“TTSService!TTSService.Form1::GX_GetMessageForWindows”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

public const int STATUS_IDLE = 1;
public const int STATUS_DIALING = 2;
public const int STATUS_DIAL_NOCHECK_DIALTONE = 3;
public const int STATUS_DIAL_WAIT_DIALTONE = 4;
public const int STATUS_DIAL_WAIT_DIALTONE1 = 5;
public const int STATUS_DIAL_WAIT_DIALTONE2 = 6;
public const int STATUS_DIAL_RESULT = 7;
public const int STATUS_DIAL_PLAY = 8;

int[] chno = new int[32];
int[] chtype = new int[32];
int[] status = new int[32];
int[] chnum = new int[32];
string[] predial = new string[32];
string[] dial = new string[32];

byte[] checkdialtone = new byte[32];
byte[] checktalktype = new byte[32];
int[] silencetime = new int[32];

int DriverOpenFlag;
int TotalVoiceChannel;
string VoicePath;
string VoiceFile;
TTSService.Class1.GX_MESSAGE_INFO MessageBuffer;
int run;
int check;
byte[] DtmfBuffer = new byte[10];

public Form1()
{
InitializeComponent();
}
[DllImport("GxUsb.dll")]//该函数初始化USB语音盒的驱动程序参数,所以在使用任何USB语音盒提供的接口函数前,一定要先调用该函数。
private static extern int GX_InitializeSystem();

[DllImport("GxUsb.dll")]//该函数释放USB语音盒的驱动程序所申请的系统资源,所以当停止USB语音盒操作时,应该调用该函数。
private static extern int GX_CloseSystem();

[DllImport("GxUsb.dll")]//停止声卡放音
private static extern int GX_StopPlaySound();

[DllImport("GxUsb.dll")]//开始声卡放音,放音结束时发送MESSAGE_PLAY_SOUND_END事件给应用程序。
private static extern int GX_StartPlaySound(String FileName, int Offset, int Length, bool bWav);
// int GX_StartPlaySound(char *FileName,unsigned long Offset,unsigned long Length,BOOL bWav);
[DllImport("GxUsb.dll")]//开始声卡监听
private static extern int GX_StartMonitorSound(int ChannelNo);

[DllImport("GxUsb.dll")]//停止声卡监听
private static extern int GX_StopMonitorSound();

[DllImport("GxUsb.dll")]//设置压缩(初始化语音盒后调用)
private static extern int GX_SetVoiceCompress(int CompressType);

[DllImport("GxUsb.dll")]//打开语音通道
private static extern int GX_OpenChannel(int ChannelNo);

[DllImport("GxUsb.dll")]//关闭语音通道
private static extern int GX_CloseChannel(int ChannelNo);

[DllImport("GxUsb.dll")]//开始识别话音,当识别到有话音时,送出事件MESSAGE_HAVE_HELLO_VOICE,并停止识别。如果需要连续识别,需要在收到事件时,再次调用该函数。
private static extern int GX_StartDetectHelloVoice(int ChannelNo, int ThresholdValue);

[DllImport("GxUsb.dll")]//停止识别话音。
private static extern int GX_StopDetectHelloVoice(int ChannelNo);

[DllImport("GxUsb.dll")]//开始识别回铃音,当在指定的时间内未识别到回铃音,送出事件MESSAGE_HAVE_BACK_TONE_HALT,并停止识别。如果需要连续识别,需要在收到事件时,再次调用该函数。
private static extern int GX_StartDetectBackToneHalt(int ChannelNo, int HaltTimeByMs);

[DllImport("GxUsb.dll")]//停止识别回铃摘机检测。
private static extern int GX_StopDetectBackToneHalt(int ChannelNo);

[DllImport("GxUsb.dll")]//识别所有频率的声音(包括450Hz的声音),定时(每隔204ms)送出识别的结果数据事件(MESSAGE_HAVE_SILENCE_DATA)。识别结果数据由16位的一个字表示,这个字的每一位的1或0分别代表有声音和无声音(静音)。USB语音盒把该时间(204ms)分成16个时间段,分别计算出每一个时间段上的声音识别结果(0/1)。16个时间段的声音识别结果(0/1)按时间先后顺序对应该事件参数Parameter的第一个字的Bit15—Bit0,“0”表示静音,“1”表示非静音。
private static extern int GX_StartDetectSilence(int ChannelNo, int ThresholdValue);

[DllImport("GxUsb.dll")]//停止识别静音。
private static extern int GX_StopDetectSilence(int ChannelNo);

[DllImport("GxUsb.dll")]//该函数取得插入计算机中的USB语音盒的逻辑通道总数量,包括语音通道和传真通道
private static extern int GX_GetTotalCardCount();

[DllImport("GxUsb.dll")]//该函数获取语音逻辑通道号码为ChannelNo的通道所对应的物理通道类型
private static extern int GX_GetChannelType(int ChannelNo);

[DllImport("GxUsb.dll")]//开始识别DTMF按键,在识别到DTMF时,发送事件(MESSAGE_HAVE_DTMF),并继续识别,直到发送停止识别命令。应用程序可以随时调用函数GX_GetDTMFKey来获取已经识别到的DTMF按键。
private static extern int GX_StartDetectDTMF(int ChannelNo, int SmartLevel);

[DllImport("GxUsb.dll")]//开始主叫识别,当识别到有主叫时,发送MESSAGE_HAVE_CID_FSK事件,并停止识别。如果需要继续识别,必须重新调用该函数。关于主叫信息需要调用GX_GetFskCallerID函数取得。
private static extern int GX_StartDetectCallerID(int ChannelNo);

[DllImport("GxUsb.dll")]// 获取USB语音盒的事件
private static extern int GX_GetMessageForWindows(int WaitTime, TTSService.Class1.GX_MESSAGE_INFO pMessageBuffer);

[DllImport("GxUsb.dll")]//设置中继模块摘机。
private static extern int GX_TrunkHookOff(int ChannelNo);

[DllImport("GxUsb.dll")]// 开始识别标准450Hz的忙音,当识别到3个忙音周期时(350/700),发送MESSAGE_HAVE_BUSY_TONE(有忙音)事件给应用程序。
private static extern int GX_StartDetectBusyTone(int ChannelNo);

[DllImport("GxUsb.dll")]//开始识别标准450Hz的拨号音,当识别到拨号音时,发送MESSAGE_HAVE_DIAL_TONE(有拨号音)事件给应用程序。
private static extern int GX_StartDetectDialTone(int ChannelNo);

[DllImport("GxUsb.dll")]//停止超时计时。
private static extern int GX_StopTimeOutForWindows(int ChannelNo);

[DllImport("GxUsb.dll")]//启动某一通道的超时计数,当相应的超时时间到达时,送出事件MESSAGE_TIME_OUT,然后再重新计时,当相应的超时时间到达时,再送出事件MESSAGE_TIME_OUT,这样周期性计时,直到停止。
private static extern int GX_StartTimeOutForWindows(int ChannelNo, int TimeBySecond);

[DllImport("GxUsb.dll")]// 产生DTMF按键。
private static extern int GX_GenerateDTMFString(int ChannelNo, string DTMFString);

[DllImport("GxUsb.dll")]//停止语音通道的一切操作,使通道恢复打开时的状态。
private static extern int GX_StopAllOperate(int ChannelNo);

[DllImport("GxUsb.dll")]//设置中继模块挂机
private static extern int GX_TrunkHookOn(int ChannelNo);

[DllImport("GxUsb.dll")]//开始识别标准450Hz的回铃音,当识别到回铃音(2个周期)时,发送MESSAGE_HAVE_BACK_TONE(有回铃音)事件给应用程序。
private static extern int GX_StartDetectBackTone(int ChannelNo);

[DllImport("GxUsb.dll")]//停止检测标准拨号音
private static extern int GX_StopDetectDialTone(int ChannelNo);

[DllImport("GxUsb.dll")]//开始检测中继模块的极性反转,该函数主要用于在特殊情况下,需要检测极性反转时,使用该函数如果检测到有极性反转,则送出事件MESSAGE_TRUNK_HAVE_POLE,并停止检测极性反转;如果需要停止检测,可以调用GX_StopDetectTrunkPolarity函数。当用于呼出时,判定对方是否摘机的极性反转,系统自动检测,无须调用该函数。
private static extern int GX_StartDetectTrunkPolarity(int ChannelNo);

[DllImport("GxUsb.dll")]//清除某一通道已经识别出来的但仍然没有被取走的DTMF按键。
private static extern int GX_ClearDTMFBuffer(int ChannelNo);

[DllImport("GxUsb.dll")]//开始文件放音,放音数据存于文件。当发送停止放音命令,或收到某个或某些设定的停止DTMF按键时,停止放音。当所有要求的放音数据放完时,停止放音,并送出事件MESSAGE_PLAY_END;当收到相应的DTMF按键时,停止放音,并送出事件MESSAGE_PLAY_EXIT。
public extern static int GX_StartPlayFile(int ChannelNo, string FileName, int Offset, int Length, int StopChar);

[DllImport("GxUsb.dll")]//停止检测标准回铃音
public extern static int GX_StopDetectBackTone(int ChannelNo);

[DllImport("GxUsb.dll")]// 获取DTMF按键,从ChannelNo通道内提取数量为DTMFCount个按键。如果含有足够数量的DTMF按键,则将按键依次添入DTMFKey所指的缓存区中,并返回TRUE;否则返回FALSE。
public extern static int GX_GetDTMFKey(int ChannelNo, int DTMFCount, byte DTMFKey);

[DllImport("GxUsb.dll")]//停止检测中继模块的极性反转
public extern static int GX_StopDetectTrunkPolarity(int ChannelNo);

[DllImport("GxUsb.dll")]//停止放音操作
public extern static int GX_StopPlayVoice(int ChannelNo);
...全文
1237 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2010-11-09
  • 打赏
  • 举报
回复
哪句调用失败?结构体或函数声明的不对。
yang448246711 2010-11-09
  • 打赏
  • 举报
回复
而且那DLL中的东西自已改不了的,是别的地方来的....内核是VC++写的.....
yang448246711 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 bloodish 的回复:]

如果你在用VS2010,碰到过类似的问题,请按以下方式修改:

dll中的导出函数的声明

unsigned short CheckMessageForWindows(unsigned short WaitTime, PGX_MESSAGE_INFO pMessageBuffer)

需要约定函数调用方式为__stdcall

unsigned short __stdcall C……
[/Quote]

我用的是2005的.....怎么改求教
liladlove 2010-11-09
  • 打赏
  • 举报
回复
观望中~~~~
bloodish 2010-11-09
  • 打赏
  • 举报
回复
如果你在用VS2010,碰到过类似的问题,请按以下方式修改:

dll中的导出函数的声明

unsigned short CheckMessageForWindows(unsigned short WaitTime, PGX_MESSAGE_INFO pMessageBuffer)

需要约定函数调用方式为__stdcall

unsigned short __stdcall CheckMessageForWindows(unsigned short WaitTime, PGX_MESSAGE_INFO pMessageBuffer)

2008,2005中PInvoke对调用方式的检查并不严格,但2010似乎严格了不少.



mingming912 2010-11-09
  • 打赏
  • 举报
回复
在结构声明中加[StructLayout(LayoutKind.Sequential)]试试
elkiss 2010-11-09
  • 打赏
  • 举报
回复
mingming912 2010-11-09
  • 打赏
  • 举报
回复
参数中有结构的,还从来没试过
yang448246711 2010-11-09
  • 打赏
  • 举报
回复
因为在VB中他是未赋值的,我在C#里面也没有赋值......
yang448246711 2010-11-09
  • 打赏
  • 举报
回复
我写成C#后是这样的:

public struct GX_MESSAGE_INFO
{
public int MessageCode;
public int ChannelNo;
public int[] Parameter;
}
mingming912 2010-11-09
  • 打赏
  • 举报
回复
应该是结构PGX_MESSAGE_INFO,两边不一样
yang448246711 2010-11-09
  • 打赏
  • 举报
回复
这个是VB中的

Type GX_MESSAGE_INFO
MessageCode As Integer
ChannelNo As Integer
Parameter(6) As Integer
End Type



yang448246711 2010-11-09
  • 打赏
  • 举报
回复
DLL文件里面的方法是这样的...
unsigned short CheckMessageForWindows(unsigned short WaitTime, PGX_MESSAGE_INFO pMessageBuffer)
huminghua 2010-11-09
  • 打赏
  • 举报
回复
GX_GetMessageForWindows这里面是些什么参数呢?你参数类型对不呢?名称一样不!
mingming912 2010-11-09
  • 打赏
  • 举报
回复
TTSService.Class1.GX_MESSAGE_INFO结构是什么样子的呢?
huminghua 2010-11-09
  • 打赏
  • 举报
回复
你的dll文件和你写的方法名称一样不!
yang448246711 2010-11-09
  • 打赏
  • 举报
回复
错误出现在:while (GX_GetMessageForWindows(0, MessageBuffer) == Class1.GX_OK)
yang448246711 2010-11-09
  • 打赏
  • 举报
回复

//有忙音
else if (MessageNumber == Class1.MESSAGE_HAVE_BUSY_TONE) {
GX_StopAllOperate(ChannelNo);
GX_TrunkHookOn(ChannelNo);
status[ChannelNo] = STATUS_IDLE;
dataGridView1.Rows[ChannelNo].Cells[2].Value = "空闲";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "忙音";
}
//有回铃音
else if (MessageNumber == Class1.MESSAGE_HAVE_BACK_TONE) {
dataGridView1.Rows[ChannelNo].Cells[2].Value = "空闲";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "回铃音";
}
//超时
else if (MessageNumber == Class1.MESSAGE_HAVE_TIME_OUT)
{
chnum[ChannelNo] = chnum[ChannelNo] + 1;
if (chnum[ChannelNo] >= 50)
{
GX_StopAllOperate(ChannelNo);
GX_TrunkHookOn(ChannelNo);
dataGridView1.Rows[ChannelNo].Cells[2].Value = "空闲";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "无人接听";
status[ChannelNo] = STATUS_IDLE;
}
}
//检测摘机方式 爆发音
else {
if(radioButton1.Checked){
if (MessageNumber == Class1.MESSAGE_HAVE_HELLO_VOICE || MessageNumber == Class1.MESSAGE_HAVE_BACK_TONE_HALT){
GX_StopDetectSilence(ChannelNo);
GX_StopTimeOutForWindows(ChannelNo);
GX_StopDetectHelloVoice(ChannelNo);
GX_StopDetectBackToneHalt(ChannelNo);
GX_StopDetectBackTone(ChannelNo);
if (GX_StartPlayFile(ChannelNo, "message.pcm", 0, -1, Class1.STOP_NOT_DTMF) == Class1.GX_OK){
status[ChannelNo] = STATUS_DIAL_PLAY;
dataGridView1.Rows[ChannelNo].Cells[2].Value = "放音";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "拨号成功";
}
else
{
GX_StopAllOperate (ChannelNo);
GX_TrunkHookOn (ChannelNo);
dataGridView1.Rows[ChannelNo].Cells[2].Value = "空闲";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "拨号成功,播放通知语音失败";
status[ChannelNo] = STATUS_IDLE;
}
}
}
//检测线路极性反转
else if (radioButton2.Checked)
{
if (MessageNumber == Class1.MESSAGE_TRUNK_POLE)
{
GX_StopDetectSilence(ChannelNo);
GX_StopTimeOutForWindows(ChannelNo);
GX_StopDetectBackTone(ChannelNo);
GX_StopDetectTrunkPolarity(ChannelNo);
if (GX_StartPlayFile(ChannelNo, "message.pcm", 0, -1, Class1.STOP_NOT_DTMF) == Class1.GX_OK)
{
status[ChannelNo] = STATUS_DIAL_PLAY;
dataGridView1.Rows[ChannelNo].Cells[2].Value = "放音";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "拨号成功";
}
else
{
GX_StopAllOperate(ChannelNo);
GX_TrunkHookOn(ChannelNo);
dataGridView1.Rows[ChannelNo].Cells[2].Value = "空闲";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "拨号成功,播放通知语音失败";
status[ChannelNo] = STATUS_IDLE;
}
}
}
else {
if (MessageNumber == Class1.MESSAGE_PLAY_VOICE_END || MessageNumber == Class1.MESSAGE_PLAY_VOICE_EXIT) {
if (GX_StartPlayFile(ChannelNo, "message.pcm", 0, -1, Class1.STOP_NOT_DTMF) == Class1.GX_OK) {
status[ChannelNo] = STATUS_DIAL_PLAY;
dataGridView1.Rows[ChannelNo].Cells[2].Value = "空闲";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "播放提示语音失败";
}
}
else if (MessageNumber == Class1.MESSAGE_HAVE_DTMF) {
if (GX_GetDTMFKey(ChannelNo, 1, DtmfBuffer[0]) == Class1.GX_OK) {
if (DtmfBuffer[0] == 0x23) {
GX_StopDetectSilence(ChannelNo);
GX_StopTimeOutForWindows(ChannelNo);
GX_StopDetectBackTone(ChannelNo);
GX_StopPlayVoice(ChannelNo);
if (GX_StartPlayFile(ChannelNo, "message.pcm", 0, -1, Class1.STOP_NOT_DTMF) == Class1.GX_OK)
{
status[ChannelNo] = STATUS_DIAL_PLAY;
dataGridView1.Rows[ChannelNo].Cells[2].Value = "放音";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "拨号成功";
}
else
{
GX_StopAllOperate(ChannelNo);
GX_TrunkHookOn(ChannelNo);
dataGridView1.Rows[ChannelNo].Cells[2].Value = "空闲";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "拨号成功,播放通知语音失败";
status[ChannelNo] = STATUS_IDLE;
}
}
}
}
}
}
break;
//通话放音
case STATUS_DIAL_PLAY:
if (MessageNumber == Class1.MESSAGE_PLAY_VOICE_END || MessageNumber == Class1.MESSAGE_PLAY_VOICE_EXIT || MessageNumber == Class1.MESSAGE_HAVE_BUSY_TONE) {
GX_StopAllOperate(ChannelNo);
GX_TrunkHookOn(ChannelNo);
dataGridView1.Rows[ChannelNo].Cells[2].Value = "放音";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "拨号成功";
}
break;

}
}
}
yang448246711 2010-11-09
  • 打赏
  • 举报
回复

public void CardWork() {
int itemp;
int ChannelNo;
int MessageNumber;
while (GX_GetMessageForWindows(0, MessageBuffer) == Class1.GX_OK)
{
ChannelNo = MessageBuffer.ChannelNo;
MessageNumber = MessageBuffer.MessageCode;
switch (status[ChannelNo])
{
case STATUS_IDLE:
switch (MessageNumber) {
case Class1.MESSAGE_TRUNK_RING:
dataGridView1.Rows[ChannelNo].Cells[3].Value = "振铃"+MessageBuffer.Parameter[0];
break;
case Class1.MESSAGE_USER_HOOK_OFF:
dataGridView1.Rows[ChannelNo].Cells[3].Value = "摘机";
break;
case Class1.MESSAGE_USER_HOOK_ON:
dataGridView1.Rows[ChannelNo].Cells[3].Value = "挂机";
break;
case Class1.MESSAGE_RECORD_OPEN_CIRCLE:
dataGridView1.Rows[ChannelNo].Cells[3].Value = "断线";
break;
case Class1.MESSAGE_RECORD_NO_OPEN_CIRCLE:
dataGridView1.Rows[ChannelNo].Cells[3].Value = "接线";
break;
case Class1.MESSAGE_RECORD_HOOK_OFF:
dataGridView1.Rows[ChannelNo].Cells[3].Value = "摘机";
break;
case Class1.MESSAGE_RECORD_HOOK_ON:
dataGridView1.Rows[ChannelNo].Cells[3].Value = "挂机";
break;
case Class1.MESSAGE_RECORD_RING:
dataGridView1.Rows[ChannelNo].Cells[3].Value = "震铃";
break;
}
break;
case STATUS_DIALING:
if (MessageNumber == Class1.MESSAGE_HAVE_TIME_OUT) {
GX_TrunkHookOff(ChannelNo);
GX_StartDetectBusyTone(ChannelNo);
chnum[ChannelNo] = 0;
status[ChannelNo] = STATUS_DIAL_WAIT_DIALTONE;
silencetime[ChannelNo] = 0;
//是否检测拨号音
if (checkBox1.Checked)
{
//检测拨号音
GX_StartDetectDialTone(ChannelNo);
//检测静音 防止没有接线
itemp = GX_StartDetectSilence(ChannelNo, 20);
status[ChannelNo] = STATUS_DIAL_WAIT_DIALTONE;
}
else {
GX_StopTimeOutForWindows(ChannelNo);
itemp = GX_StartTimeOutForWindows(ChannelNo, 2);
status[ChannelNo] = STATUS_DIAL_NOCHECK_DIALTONE;
}
dataGridView1.Rows[ChannelNo].Cells[3].Value = "摘机";
}
break;
case STATUS_DIAL_NOCHECK_DIALTONE:
if (MessageNumber == Class1.MESSAGE_HAVE_TIME_OUT) {
GX_StopTimeOutForWindows(ChannelNo);
GX_StopDetectDialTone(ChannelNo);
if (predial[ChannelNo].Equals(""))
{
itemp = GX_GenerateDTMFString(ChannelNo, predial[ChannelNo]);
status[ChannelNo] = STATUS_DIAL_WAIT_DIALTONE1;
dataGridView1.Rows[ChannelNo].Cells[3].Value = "出局";
}
else {
chnum[ChannelNo] = 0;
status[ChannelNo] = STATUS_DIAL_RESULT;
dataGridView1.Rows[ChannelNo].Cells[3].Value = "拨号";
}
}
break;
case STATUS_DIAL_WAIT_DIALTONE1:
if (MessageNumber == Class1.MESSAGE_HAVE_BUSY_TONE) {
GX_StopAllOperate(ChannelNo);
GX_TrunkHookOn(ChannelNo);
status[ChannelNo] = STATUS_IDLE;
dataGridView1.Rows[ChannelNo].Cells[2].Value = "空闲";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "忙音";
}
if (MessageNumber == Class1.MESSAGE_GENERATE_DTMF_END) {
itemp = GX_StartTimeOutForWindows(ChannelNo, 2);
status[ChannelNo] = STATUS_DIAL_WAIT_DIALTONE2;
}
break;
case STATUS_DIAL_WAIT_DIALTONE2:
GX_StopTimeOutForWindows(ChannelNo);
itemp = GX_GenerateDTMFString(ChannelNo, dial[ChannelNo]);
chnum[ChannelNo] = 0;
status[ChannelNo] = STATUS_DIAL_RESULT;
dataGridView1.Rows[ChannelNo].Cells[3].Value = "拨号";
break;
case STATUS_DIAL_RESULT:
//拨号结束
if (MessageNumber == Class1.MESSAGE_GENERATE_DTMF_END) {
//超时检测 50s
itemp = GX_StartTimeOutForWindows(ChannelNo, 1);
chnum[ChannelNo] = 0;
//检测回铃音
GX_StartDetectBackTone(ChannelNo);
//不检测拨号音拨号时
if (checkBox1.Checked==false) {
//检测静音 防止没有接线
itemp = GX_StartDetectSilence(ChannelNo, 20);
}
//检测摘机方式
//检测爆发音
if (radioButton1.Checked) {
//检测爆发音(摘机后的hello音)
itemp = GX_StartDetectHelloVoice(ChannelNo, 19);
//检测回铃终止音
itemp = GX_StartDetectBackToneHalt(ChannelNo, 10000);
dataGridView1.Rows[ChannelNo].Cells[2].Value = "检测";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "等待拨号结果";
}
//检测线路极性反转(需向电信局申请)
else if (radioButton2.Checked)
{
//检测线路极性反转
GX_StartDetectTrunkPolarity(ChannelNo);
dataGridView1.Rows[ChannelNo].Cells[2].Value = "检测";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "等待拨号结果";
}
//按键确认
else {
//启动按键检测
itemp = GX_StartDetectDTMF(ChannelNo, 0);
GX_ClearDTMFBuffer(ChannelNo);
if (GX_StartPlayFile(ChannelNo, "note.pcm", 0, -1, Class1.STOP_NOT_DTMF) == Class1.GX_OK) {
GX_StopAllOperate(ChannelNo);
GX_TrunkHookOn(ChannelNo);
status[ChannelNo] = STATUS_IDLE;
dataGridView1.Rows[ChannelNo].Cells[2].Value = "空闲";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "播放提示语音失败";
}
}
}
else if (MessageNumber == Class1.MESSAGE_HAVE_SILENCE_DATA) {
if (MessageBuffer.Parameter[0] == 0)
{
silencetime[ChannelNo] = silencetime[ChannelNo] + 1;
//每个消息204ms 5个为1s
//检测10s 防止拨打线路后接续慢的情况
if (silencetime[ChannelNo] >= 50)
{
GX_StopAllOperate(ChannelNo);
GX_TrunkHookOn(ChannelNo);
status[ChannelNo] = STATUS_IDLE;
dataGridView1.Rows[ChannelNo].Cells[2].Value = "空闲";
dataGridView1.Rows[ChannelNo].Cells[3].Value = "无声音,请检测有无接电话线";
}
}
else {
silencetime[ChannelNo] = 0;
}
}

healer_kx 2010-11-09
  • 打赏
  • 举报
回复
说明你的声明和目标DLL的函数声明是不一致的,就是这个事情。。。
加载更多回复(1)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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