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; 
}