可以
附录Q 使用第三方应用程序调用STC发布项目程序对单片机进行ISP下载
使用STC的ISP下载软件生成的发布项目程序为可执行的EXE格式文件,用户可直接双击发布的项目程序运行进行ISP下载,也可在第三方的应用程序中调用发布项目程序进行ISP下载。下面介绍两种调用的方法。 简单调用 在第三方应用程序中只是简单创建发布项目程序的进程,其他的所有下载操作均在发布项目程序中进行,第三方应用程序此时只需要等待发布项目程序操作完成后,清理现场即可。 VC代码
BOOL IspProcess() { //定义相关变量 STARTUPINFO si; PROCESS_INFORMATIONpi; CString path; //发布项目程序的完整路径 path =_T("D:\\Work\\Upgrade.exe"); //变量初始化 memset(&si, 0,sizeof(STARTUPINFO)); memset(&pi, 0,sizeof(PROCESS_INFORMATION)); //设置启动变量 si.cb =sizeof(STARTUPINFO); GetStartupInfo(&si); si.wShowWindow =SW_SHOWNORMAL; si.dwFlags =STARTF_USESHOWWINDOW; //创建发布项目程序进程 if(CreateProcess(NULL, (LPTSTR)(LPCTSTR)path, NULL, NULL, FALSE, 0, NULL, NULL,&si, &pi)) { //等待发布项目程序操作完成 //由于此处会阻塞主进程,所以建议新建工作进程,在工作进程中进行等待 WaitForSingleObject(pi.hProcess,INFINITE); //清理工作 CloseHandle(pi.hThread); CloseHandle(pi.hProcess); returnTRUE; } else { AfxMessageBox(_T("创建进程失败 !")); returnFALSE; } }
高级调用 在第三方应用程序创建发布项目程序的进程,并在第三方应用程序中进行包括选择串口、开始ISP编程、停振ISP编程以及关闭发布项目程序等的全部ISP下载操作,而不需要在发布项目程序中进行界面互动。 VC代码
//定义回调函数参数的数据结构 struct CALLBACK_PARAM { DWORDdwProcessId; //主进程ID HWNDhMainWnd; //主窗口句柄 }; //枚举窗口的回调函数,用于获取主窗口句柄 BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam) { CALLBACK_PARAM *pcp =(CALLBACK_PARAM *)lParam; DWORD id; GetWindowThreadProcessId(hWnd,&id); if((pcp->dwProcessId == id) && (GetParent(hWnd) == NULL)) { pcp->hMainWnd= hWnd; returnFALSE; } return TRUE; } BOOL IspProcess() { //定义相关变量 STARTUPINFO si; PROCESS_INFORMATIONpi; CALLBACK_PARAM cp; CString path; //发布项目程序中部分控件的ID constUINT ID_PROGRAM = 1013; constUINT ID_STOP = 1012; constUINT ID_COMPORT = 1001; constUINT ID_PROGRESS = 1000; //发布项目程序的完整路径 path =_T("D:\\Work\\Upgrade.exe"); //变量初始化 memset(&si, 0,sizeof(STARTUPINFO)); memset(&pi, 0,sizeof(PROCESS_INFORMATION)); memset(&cp, 0,sizeof(CALLBACK_PARAM)); //设置启动变量 si.cb =sizeof(STARTUPINFO); GetStartupInfo(&si); si.wShowWindow= SW_SHOWNORMAL; //此处若设置为SW_HIDE,就不会显示发布项目程序 //的操作界面,所有的ISP操作都可在后台进行 si.dwFlags =STARTF_USESHOWWINDOW; //创建发布项目程序进程 if(CreateProcess(NULL, (LPTSTR)(LPCTSTR)path, NULL, NULL, FALSE, 0, NULL, NULL,&si, &pi)) { //等待发布项目程序进程初始化完成 WaitForInputIdle(pi.hProcess,5000); //获取发布项目程序的主窗口句柄 cp.dwProcessId= pi.dwProcessId; cp.hMainWnd= NULL; EnumWindows(EnumWindowCallBack,(LPARAM)&cp); if(cp.hMainWnd != NULL) { HWNDhProgram; HWNDhStop; HWNDhPort; //获取发布项目程序主窗口中部分控件句柄 hProgram= ::GetDlgItem(cp.hMainWnd, ID_PROGRAM); hStop= ::GetDlgItem(cp.hMainWnd, ID_STOP); hPort= ::GetDlgItem(cp.hMainWnd, ID_COMPORT); //设置发布项目程序中的串口号, 第3个参数为0:COM1, 1:COM2, 2:COM3, ... ::SendMessage(hPort,CB_SETCURSEL, 0, 0); //触发编程按钮开始ISP编程 ::SendMessage(hProgram,BM_CLICK, 0, 0); //等待编程完成, //由于此处会阻塞主进程,所以建议新建工作进程,在工作进程中进行等待 while(!::IsWindowEnabled(hProgram)); //编程完成后关闭发布项目程序 ::SendMessage(cp.hMainWnd,WM_CLOSE, 0, 0); } //等待进程结束 WaitForSingleObject(pi.hProcess,INFINITE); //清理工作 CloseHandle(pi.hThread); CloseHandle(pi.hProcess); returnTRUE; } else { AfxMessageBox(_T("创建进程失败 !")); returnFALSE; } }
|