www.pudn.com > LabWindowsCVI.rar > sample14.c
#include#include #include #include #include #include #include "sample14.h" #include static int panelHandle; unsigned int datalink,systemlink; int CVICALLBACK ClientCallback( unsigned dde_handle, char *topicName, char *itemName, int event, int dataFmt, int dataSize, void *dataPtr, void *callbackData); int main (int argc, char *argv[]) { if (InitCVIRTE (0, argv, 0) == 0) return -1; if ((panelHandle = LoadPanel (0, "sample14.uir", PANEL)) < 0) return -1; //调试过程中不显示出错对话框 DisableBreakOnLibraryErrors(); DisplayPanel (panelHandle); RunUserInterface (); //设置控件STATUS的值,显示退出程序 SetCtrlVal (panelHandle, PANEL_STATUS, "Quit Program..."); //断开与xls文件的连接 DisconnectFromDDEServer (datalink); //向EXCEL发送命令关闭xls文件 ClientDDEExecute (systemlink, "[CLOSE(0)]", 0); //向EXCEL发送命令退出EXCEL ClientDDEExecute (systemlink, "[QUIT()]", 0); EnableBreakOnLibraryErrors (); return 0; } int CVICALLBACK PanelCallback (int panel, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_CLOSE: QuitUserInterface (0); break; } return 0; } int CVICALLBACK LaunchCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { char excelpath [MAX_PATHNAME_LEN]; switch (event) { case EVENT_COMMIT: //获取控件EXCELPATH的值 GetCtrlVal (panel, PANEL_EXCELPATH, excelpath); //运行excel.exe文件 LaunchExecutable (excelpath); //设置控件LAUNCH无效,控件CONNECT有效 SetCtrlAttribute (panel, PANEL_LAUNCH, ATTR_DIMMED, 1); SetCtrlAttribute (panel, PANEL_CONNECT, ATTR_DIMMED, 0); break; } return 0; } int CVICALLBACK ConnectCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int status; switch (event) { case EVENT_COMMIT: //设置控件STATUS的值,显示连接消息 SetCtrlVal (panel, PANEL_STATUS, "Connecting to Work Sheet...\n"); //建立程序和Excel系统的连接 status = ConnectToDDEServer (&systemlink, "excel", "system", ClientCallback, 0); if (status<0) //连接失败,显示出错信息 SetCtrlVal (panel, PANEL_STATUS, "Connection to Work Sheet failed.\n"); else { //连接成功 SetCtrlVal (panel, PANEL_STATUS, "Connection to Worksheet Successful.\n"); //设置控件CONNECT无效,控件OPENFILE有效 SetCtrlAttribute (panel, PANEL_CONNECT, ATTR_DIMMED, 1); SetCtrlAttribute (panel, PANEL_OPENFILE, ATTR_DIMMED, 0); } break; } return 0; } int CVICALLBACK OpenFileCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int status; char filename[MAX_PATHNAME_LEN]; char command[150]; char cellvalStr[100]; double cellVal; switch (event) { case EVENT_COMMIT: //弹出文件选择对话框 status = FileSelectPopup ("", "*.xls", "*.xls", "Open File", VAL_LOAD_BUTTON, 0, 0, 1, 0, filename); //向Excel发出命令打开xls文件 Fmt (command, "%s<[OPEN(\"%s\")]", filename); status = ClientDDEExecute (systemlink, command, 0); //建立程序与xls文件的连接 status = ConnectToDDEServer (&datalink, "excel", filename, ClientCallback, 0); if (status<0) //连接失败,显示出错信息 SetCtrlVal (panel, PANEL_STATUS, "Open Sheets Failed\n"); else { //连接成功 SetCtrlVal (panel, PANEL_STATUS, "Open Sheets Successful\n"); //设置控件OPENFILE无效,控件CLOSEFILE有效, //控件SENTDATA有效 SetCtrlAttribute (panel, PANEL_OPENFILE, ATTR_DIMMED, 1); SetCtrlAttribute (panel, PANEL_CLOSEFILE, ATTR_DIMMED, 0); SetCtrlAttribute (panel, PANEL_SENTDATA, ATTR_DIMMED, 0); } //建立程序与xls文件中的某项的热连接 if ((status = SetUpDDEHotLink (datalink, "R10C1", CF_TEXT, 5000))<0) //连接失败,显示出错信息 SetCtrlVal (panel, PANEL_STATUS, "SetUpWarmLink Failed"); //读取xls文件中的某项的值 ClientDDERead (datalink, "R10C1", CF_TEXT, cellvalStr, sizeof(cellvalStr), 0); //将读取的数据显示在CELLVALUE控件中 sscanf ((char*)cellvalStr, "%lf", &cellVal); SetCtrlVal (panel, PANEL_CELLVALUE, cellVal); break; } return 0; } int CVICALLBACK CloseFileCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int close_style,status; char command[50]; switch (event) { case EVENT_COMMIT: //获取控件CLOSESTYLE的值 GetCtrlVal (panel, PANEL_CLOSESTYLE, &close_style); //显示关闭xls文件消息 SetCtrlVal (panel, PANEL_STATUS, "Closing Sheet...\n"); //向Excel发送关闭文件的命令 Fmt (command, "%s<[CLOSE(%i)]", close_style); status=ClientDDEExecute (systemlink, command, 0); if (status < 0) //关闭文件失败,显示出错信息 SetCtrlVal (panel, PANEL_STATUS, "Close Sheet Failed\n"); else { //关闭文件成功 SetCtrlVal (panel, PANEL_STATUS, "Close Sheet Successful\n"); //设置控件OPENFILE有效,控件CLOSEFILE无效, //控件SENTDATA无效 SetCtrlAttribute (panel, PANEL_OPENFILE, ATTR_DIMMED, 0); SetCtrlAttribute (panel, PANEL_CLOSEFILE, ATTR_DIMMED, 1); SetCtrlAttribute (panel, PANEL_SENTDATA, ATTR_DIMMED, 1); } break; } return 0; } int CVICALLBACK SentDataCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { double data[60]; int status,data_type,i,j=0; char data_buffer[1500]; switch (event) { case EVENT_COMMIT: //获取控件WAVEFORM的值 GetCtrlVal (panel, PANEL_WAVEFORM, &data_type); //根据控件WAVEFORM的值产生不同的数据 switch (data_type) { case 0 : // 正弦波数据 for (i=0;i<50;i++) data[i] = 50 * sin((((2*3.1415926539)/50) * i)) + 50; break; case 1 : // 三角波数据 for (i=0;i<13;i++) { data[i] = i*7.69; data[i+13] = 100 - (i*7.69); data[i+26] = i*7.69; data[i+39] = 100 - (i*7.69); } break; case 2 : // 方波数据 for (i=0;i<16;i++) data[i] = 33.0; for (i=16;i<33;i++) data[i] = 67.0; for (i=33;i<50;i++) data[i] = 33.0; break; } //显示发送数据消息 SetCtrlVal (panel, PANEL_STATUS, "Sending Data to Worksheet\n"); //向EXCEL发送数据 for (i=0; i<50; i++) { sprintf(&data_buffer[j],"%f\n", data[i]); j=strlen(data_buffer); } status = ClientDDEWrite (datalink, "R1C1:R50C1", CF_TEXT, data_buffer, strlen(data_buffer), 1000); if(status<0) //发送数据失败 SetCtrlVal (panel, PANEL_STATUS, "Data Sent Successful.\n"); else //发送数据成功 SetCtrlVal (panel, PANEL_STATUS, "Data Sent Failes.\n"); break; } return 0; } int CVICALLBACK QuitCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: QuitUserInterface (0); break; } return 0; } int CVICALLBACK ClientCallback( unsigned dde_handle, char *topicName, char *itemName, int event, int dataFmt, int dataSize, void *dataPtr, void *callbackData) { double value; switch (event) { //接收到EXCEL发送的数据 case DDE_DATAREADY: //将读取的数据,显示到控件CELLVALUE中 sscanf ((char*)dataPtr, "%lf", &value); SetCtrlVal (panelHandle, PANEL_CELLVALUE, value); break; //DDE断开连接 case DDE_DISCONNECT: //显示断开连接消息 SetCtrlVal (panelHandle, PANEL_STATUS, "Connection Closed!!!\n"); break; } return 0; }