軟件開發中幾個常用功能的實現
出處:vchelp.net
責任編輯:leelee
[04-8-12 10:01] 作者:戚高
在進行軟件開發過程中間,有很多小功能的實現,雖然這些東西你可以不用,但是如果應用仂將會是你的程序更具有專業性。
一、設置程序自動運行。
很多監控軟件要求軟件能夠在系統重新啓動後不用用戶去點擊圖標啓動項目,而是直接能夠啓動運行,方法是寫註冊表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++;
}