在進行軟體開發過程中間,有很多小功能的實現,雖然這些東西你可以不用,但是如果應用仂將會是你的程式更具有專業性。
一、設定程式自動運行。
很多監視軟體要求軟體能夠在系統重新啟動後不用使用者去點擊表徵圖啟動項目,而是直接能夠啟動運行,方法是寫註冊表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++;
}