一、設置程序自動運行。??
???????很多監控軟件要求軟件能夠在系統重新啟動后不用用戶去點擊圖標啟動項目,而是直接能夠啟動運行,方法是寫注冊表Software\\Microsoft\\Windows\\CurrentVersion\\Run。參考程序可以見下:(查找程序目錄的執行文件,存在則進行添加注冊表操作)?
???????? HKEY RegKey;?
???????? CString sPath;?
???????? GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);?
???????? sPath.ReleaseBuffer();?
???????? int nPos;?
??? nPos=sPath.ReverseFind(’\\’);?
??? sPath=sPath.Left(nPos);?
??? CString lpszFile=sPath+"\\****.exe";//這里加上你要查找的執行文件名稱?
??? CFileFind fFind;?
??? BOOL bSuccess;?
??? bSuccess=fFind.FindFile(lpszFile);?
??? fFind.Close();?
??? if(bSuccess)?
??? {?
??????? CString fullName;?
??????? fullName=lpszFile;?
??????? RegKey=NULL;?
??????? RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&RegKey);?
??????? RegSetValueEx(RegKey,"*****",0,REG_SZ,(const unsigned char*)(LPCTSTR)fullName,fullName.GetLength());//這里加上你需要在注冊表中注冊的內容?
??????? this->UpdateData(FALSE);?
??? }?
??? else?
??? {?
??????? theApp.SetMainSkin();?
??????? ::AfxMessageBox("沒找到執行程序,自動運行失敗");?
??????? exit(0);?
??? }?
二、自動配置數據源?
??? 很多的程序都要用到數據庫結合的操作,這里舉例ACCESS,因為ACCESS在中小型VC系統開發中是最常用到的,如果程序的移植,如果對于很初級的用戶來說,你還需要他到配置面板中進行數據源配置的話,那就有點說不過去了。?
???????? #include <odbcinst.h>?
???????? //配置數據源,數據庫在應用程序目錄下,這里比如數據庫文件名為***.mdb,程序運行時候可以將數據庫文件拷貝到程序目錄下面。?
??? CString sPath;?
??? GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);?
??? sPath.ReleaseBuffer();?
??? int nPos;?
??? nPos=sPath.ReverseFind(’\\’);?
??? sPath=sPath.Left(nPos);?
??? CString lpszFileName = sPath + "\\***.mdb";//這里修改成你的數據庫文件名稱?
??? CFileFind? fFind;?
??? if(!fFind.FindFile(lpszFileName))?
??? {?
??????? ::AfxMessageBox("沒有找到數據庫");?
??????? exit(0);?
??? }??
??? CString szDesc;?
??? szDesc.Format( "DSN=****;Description=****;DESCRIPTION=The DataBase For ***;FIL=MicrosoftAccess;DEFAULTDIR=%s;DBQ=%s;" ,sPath,lpszFileName);//這里***號可以添加成你的描述?
??? //添加數據源?
??? if(!::SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)",(LPCSTR)szDesc))?
??? {?
??????? ::AfxMessageBox("32位ODBC數據源配置錯誤!");?
??????? exit(0);?
??? }?
三、設置顯示模式:?
??? 很多的程序的移植的運行環境是改變的。有可能你的原來開發環境是1024X768,但是到了那些顯示器大于17的時候(分辨率超過你的開發時的分辨率時),程序的顯示可能就不好看了。?
???????? DEVMODE lpDevMode;?
??? lpDevMode.dmPelsHeight=768;//Y方向象素點?
??? lpDevMode.dmPelsWidth=1024;//X方向象素點?
??? lpDevMode.dmDisplayFrequency=85;//屏幕刷新率?
??? lpDevMode.dmFields=DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;?
??? ChangeDisplaySettings(&lpDevMode,0);?
四、在你的程序中間加載其他應用程序:?
??? 你的程序除了調用到各個模塊進行協同工作外(DLL),還有可能調用不是同一個開發環境下的應用程序,比如VC環境下調用DELPHI,VB開發的執行程序,你就可以用到下面的方法(將調用的應用程序拷貝程序目錄中):?
???????? CString sPath;?
??? GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);?
??? sPath.ReleaseBuffer();?
??? int nPos;?
??? nPos=sPath.ReverseFind(’\\’);?
??? sPath=sPath.Left(nPos);?
??? CString lpszFileName = sPath + "\\***.exe";//這里修改成你的調用應用程序的文件名稱?
??? CFileFind? fFind;?
??? if(!fFind.FindFile(lpszFileName))?
??? {?
??????? ::AfxMessageBox("沒有找到調用的應用程序!");??
??????? return FALSE;?
??? }?
??? else?
??????? ShellExecute(NULL,NULL,_T("***.exe"),NULL,sPath,NULL);??
五、結束進程:?
??? 在你的程序中結束別的程序進程,采用的方法是進行進程列舉,然后采用查找的方法進行:?
???????? #include "TLHELP32.H"?
???????? DWORD ProcessID[50];?
??? CString kkk[50];?
??? HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);??
??? PROCESSENTRY32* info=new PROCESSENTRY32;?
??? PROCESSENTRY32 ProcessInfo;//聲明進程信息變量?
??? ProcessInfo.dwSize=sizeof(ProcessInfo);//設置ProcessInfo的大小?
??? //返回系統中第一個進程的信息?
??? BOOL Status=Process32First(SnapShot,&ProcessInfo);?
??? int m_nProcess=0;??
??? while(Status)?
??? {?
??????? CString s,str1,str2;?
??????? s.Format("%d",ProcessInfo.cntThreads);?
??????? str1.Format("%s",ProcessInfo.szExeFile);?
??????? str1=ProcessInfo.szExeFile;?
??????? kkk[m_nProcess]=ProcessInfo.szExeFile;??
??????? ProcessID[m_nProcess]=ProcessInfo.th32ProcessID;??
??????? if(str1=="***.exe")//***.exe就是你要結束的進程的名稱?
??????? {?
??????????? HANDLE ProcessHandle;?
??????????? ProcessHandle=OpenProcess (PROCESS_ALL_ACCESS,FALSE,ProcessID[m_nProcess]);?
??????????? TerminateProcess(ProcessHandle,0);?????
??????? }?
??????? Status=Process32Next(SnapShot,&ProcessInfo);?
??????? m_nProcess++;?
??? }?