?????????在進(jìn)行軟件開(kāi)發(fā)過(guò)程中間,有很多小功能的實(shí)現(xiàn),雖然這些東西你可以不用,但是如果應(yīng)用仂將會(huì)是你的程序更具有專(zhuān)業(yè)性。?
一、設(shè)置程序自動(dòng)運(yùn)行。??
???????很多監(jiān)控軟件要求軟件能夠在系統(tǒng)重新啟動(dòng)后不用用戶(hù)去點(diǎn)擊圖標(biāo)啟動(dòng)項(xiàng)目,而是直接能夠啟動(dòng)運(yùn)行,方法是寫(xiě)注冊(cè)表Software\\Microsoft\\Windows\\CurrentVersion\\Run。參考程序可以見(jiàn)下:(查找程序目錄的執(zhí)行文件,存在則進(jìn)行添加注冊(cè)表操作)?
???????? 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";//這里加上你要查找的執(zhí)行文件名稱(chēng)?
??? 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());//這里加上你需要在注冊(cè)表中注冊(cè)的內(nèi)容?
??????? this->UpdateData(FALSE);?
??? }?
??? else?
??? {?
??????? theApp.SetMainSkin();?
??????? ::AfxMessageBox("沒(méi)找到執(zhí)行程序,自動(dòng)運(yùn)行失敗");?
??????? exit(0);?
??? }?
二、自動(dòng)配置數(shù)據(jù)源?
??? 很多的程序都要用到數(shù)據(jù)庫(kù)結(jié)合的操作,這里舉例ACCESS,因?yàn)锳CCESS在中小型VC系統(tǒng)開(kāi)發(fā)中是最常用到的,如果程序的移植,如果對(duì)于很初級(jí)的用戶(hù)來(lái)說(shuō),你還需要他到配置面板中進(jìn)行數(shù)據(jù)源配置的話(huà),那就有點(diǎn)說(shuō)不過(guò)去了。?
???????? #include <odbcinst.h>?
???????? //配置數(shù)據(jù)源,數(shù)據(jù)庫(kù)在應(yīng)用程序目錄下,這里比如數(shù)據(jù)庫(kù)文件名為***.mdb,程序運(yùn)行時(shí)候可以將數(shù)據(jù)庫(kù)文件拷貝到程序目錄下面。?
??? 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";//這里修改成你的數(shù)據(jù)庫(kù)文件名稱(chēng)?
??? CFileFind? fFind;?
??? if(!fFind.FindFile(lpszFileName))?
??? {?
??????? ::AfxMessageBox("沒(méi)有找到數(shù)據(jù)庫(kù)");?
??????? exit(0);?
??? }??
??? CString szDesc;?
??? szDesc.Format( "DSN=****;Description=****;DESCRIPTION=The DataBase For ***;FIL=MicrosoftAccess;DEFAULTDIR=%s;DBQ=%s;" ,sPath,lpszFileName);//這里***號(hào)可以添加成你的描述?
??? //添加數(shù)據(jù)源?
??? if(!::SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)",(LPCSTR)szDesc))?
??? {?
??????? ::AfxMessageBox("32位ODBC數(shù)據(jù)源配置錯(cuò)誤!");?
??????? exit(0);?
??? }?
三、設(shè)置顯示模式:?
??? 很多的程序的移植的運(yùn)行環(huán)境是改變的。有可能你的原來(lái)開(kāi)發(fā)環(huán)境是1024X768,但是到了那些顯示器大于17的時(shí)候(分辨率超過(guò)你的開(kāi)發(fā)時(shí)的分辨率時(shí)),程序的顯示可能就不好看了。?
???????? DEVMODE lpDevMode;?
??? lpDevMode.dmPelsHeight=768;//Y方向象素點(diǎn)?
??? lpDevMode.dmPelsWidth=1024;//X方向象素點(diǎn)?
??? lpDevMode.dmDisplayFrequency=85;//屏幕刷新率?
??? lpDevMode.dmFields=DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;?
??? ChangeDisplaySettings(&lpDevMode,0);?
四、在你的程序中間加載其他應(yīng)用程序:?
??? 你的程序除了調(diào)用到各個(gè)模塊進(jìn)行協(xié)同工作外(DLL),還有可能調(diào)用不是同一個(gè)開(kāi)發(fā)環(huán)境下的應(yīng)用程序,比如VC環(huán)境下調(diào)用DELPHI,VB開(kāi)發(fā)的執(zhí)行程序,你就可以用到下面的方法(將調(diào)用的應(yīng)用程序拷貝程序目錄中):?
???????? 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";//這里修改成你的調(diào)用應(yīng)用程序的文件名稱(chēng)?
??? CFileFind? fFind;?
??? if(!fFind.FindFile(lpszFileName))?
??? {?
??????? ::AfxMessageBox("沒(méi)有找到調(diào)用的應(yīng)用程序!");??
??????? return FALSE;?
??? }?
??? else?
??????? ShellExecute(NULL,NULL,_T("***.exe"),NULL,sPath,NULL);??
五、結(jié)束進(jìn)程:?
??? 在你的程序中結(jié)束別的程序進(jìn)程,采用的方法是進(jìn)行進(jìn)程列舉,然后采用查找的方法進(jìn)行:?
???????? #include "TLHELP32.H"?
???????? DWORD ProcessID[50];?
??? CString kkk[50];?
??? HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);??
??? PROCESSENTRY32* info=new PROCESSENTRY32;?
??? PROCESSENTRY32 ProcessInfo;//聲明進(jìn)程信息變量?
??? ProcessInfo.dwSize=sizeof(ProcessInfo);//設(shè)置ProcessInfo的大小?
??? //返回系統(tǒng)中第一個(gè)進(jìn)程的信息?
??? 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就是你要結(jié)束的進(jìn)程的名稱(chēng)?
??????? {?
??????????? HANDLE ProcessHandle;?
??????????? ProcessHandle=OpenProcess (PROCESS_ALL_ACCESS,FALSE,ProcessID[m_nProcess]);?
??????????? TerminateProcess(ProcessHandle,0);?????
??????? }?
??????? Status=Process32Next(SnapShot,&ProcessInfo);?
??????? m_nProcess++;?
??? }?