产生Library function error .Invalid control ID 出错!如何解决!
NON-FATAL RUN-TIME ERROR: "MBX.c", line 62, col 5, thread id 0x000005B0: Library function error (return value == -13 ). Invalid control ID#include "mbaxp.h"
#include <ansi_c.h>
#include <cvirte.h>
#include <userint.h>
#include "MBX.h"
static CAObjHandle objecthandle;
static int panelHandle;
static VBOOL Bok;
static short int Error;
static short int rhandle;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "MBX.uir", PANEL)) < 0)
return -1;
GetObjHandleFromActiveXCtrl(panelHandle,PANEL_MBAXP,&objecthandle);
MBAXPLib__DMbaxpSetConnection (objecthandle, NULL, MBAXPLibConst_Port1);
MBAXPLib__DMbaxpSetBaudRate (objecthandle, NULL, MBAXPLibConst_B9600);
MBAXPLib__DMbaxpSetDataBits (objecthandle, NULL, MBAXPLibConst_Eight);
MBAXPLib__DMbaxpSetParity (objecthandle, NULL, MBAXPLibConst_NONE);
MBAXPLib__DMbaxpSetStopBits (objecthandle, NULL, MBAXPLibConst_One);
MBAXPLib__DMbaxpSetProtocolMode (objecthandle, NULL, MBAXPLibConst_RTU);
MBAXPLib__DMbaxpSetTimeout (objecthandle, NULL, 1000);
MBAXPLib__DMbaxpOpenConnection (objecthandle, NULL, &Bok);
MBAXPLib__DMbaxpReadHoldingRegisters (objecthandle, NULL, 1, 1, 0, 14, 1000, &Bok);
MBAXPLib__DMbaxpUpdateEnable (objecthandle, NULL, 1, &Bok);
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK TimerCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
short value;
float fv,cppm,cgm3,cwt,Lv;
int i;
static unsigned int cnt = 0;
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 0, &value);
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 1, &value);
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 2, &value);
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 3, &value);
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 4, &value);
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 5, &value);
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 6, &value);
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 7, &value);
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 8, &value);
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 9, &value);
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 10, &value);
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 11, &value);
MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 12, &value);
MBAXPLib__DMbaxpGetLastError (objecthandle, NULL, &Error);
SetCtrlVal(panelHandle,PANEL_NUMERIC_17,Error); //这个语句出错~~~ 运行的时候,很正常;在我按EXIT时,已经正常调用了ExitCB
//PANEL_NUMERIC_17 这个控件是存在的,
for(i=0; i<13; i++)
{
fv = (float)value;
}
// ctmp = UP0*(Ut/10 + 273.0)*log((float)v1/v2)*1000000.0/308.0/(C_L2 - C_L1)/Up/273.0;
GetCtrlVal(panelHandle,PANEL_NUMERIC_15,&Lv);
if((fv > 0.0001)&&(fv > 0.0001)&&(fv > 0.0001))
{
cppm = 272.0*(fv/10+273.0)*log(fv/fv)*1000000.0/308.0/-Lv/fv/273.0;
cgm3 = 48*cppm/22414;
cwt= 100*cgm3/(cgm3+(1-cgm3*22.414/48000)*1429);
}
else
{
cppm = 0.0f;
cgm3 = 0.0f;
cwt= 0.0f;
}
SetCtrlVal(panelHandle,PANEL_NUMERIC_16,cppm);
SetCtrlVal(panelHandle,PANEL_NUMERIC_18,cgm3);
SetCtrlVal(panelHandle,PANEL_NUMERIC_19,cwt);
fv /= 1000;
fv /= 1000;
fv /= 1000;
fv /= 1000;
fv /= 10;
fv /= 1000;
fv /= 1000;
fv /= 1000;
fv /= 1000;
fv /= 1000;
fv /= 100;
fv /= 100;
fv /= 100;
SetCtrlVal(panelHandle,PANEL_NUMERIC,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_2,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_3,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_4,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_5,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_7,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_8,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_9,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_10,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_11,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_12,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_13,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_14,fv);
SetCtrlVal(panelHandle,PANEL_NUMERIC_6,++cnt);
return 0;
}
int CVICALLBACK ExitCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
MBAXPLib__DMbaxpCloseConnection (objecthandle, NULL);
QuitUserInterface(0);
break;
}
return 0;
}
[ 本帖最后由 cyberjok 于 2008-2-2 12:23 编辑 ] 感觉可能是这时候它已经将这个面板给DISCARD了,然后它就会提示控件不存在了!要不在退出前给一个标志位,比如给某一个全局变量赋个值,然后您那个出错之前做个判断,看是否处于退出状态,如果是,就不进行后续操作,直接RETURN,否则就执行,这样应该就不会出错了! 另外兄弟发贴可以将标题写得跟内容较相近,这样易于资料整理和问题的解决,谢谢!
http://www.cpubbs.com/bbs/thread-2068-1-1.html 谢谢!现在把它改过来!!!
回复 2# 的帖子
赞成CPUBBS的意见。我试过了,将界面初始化时的DiscardPanel(panelHandle)注释掉就可以了
页:
[1]