1.改变当前目录到EXE所在的目录
在VC++开发环境中直接运行程序,当前目录不是EXE所在的目录,这样会造成一些麻烦,比如使用相对路径打开文件。使用以下代码将当前目录设成EXE所在的目录:
void ChangeCurDirToExe()
{
CString strPath;
::GetModuleFileName(NULL,strPath.GetBuffer(MAX_PATH),MAX_PATH);
strPath.ReleaseBuffer();
strPath = strPath.Left(strPath.ReverseFind(L'\\') +1 );
::SetCurrentDirectory(strPath.GetBuffer());
}
2.开机自运行
HKEY m_regkey;
TCHAR filename[_MAX_PATH];
GetModuleFileName(NULL,filename,_MAX_PATH);
RegOpenKey(HKEY_LOCAL_MACHINE,L"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&m_regkey);
RegSetValueEx(m_regkey,L"程序名称",0,REG_SZ,(const unsigned char *)filename,MAX_PATH);
RegCloseKey(m_regkey);
3.取消开机自运行
HKEY hKey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS)
{
RegDeleteValue(hKey,L"程序名称");
RegCloseKey(hKey);
}
4.退出后重启
TCHAR szPath[MAX_PATH];
GetModuleFileName(NULL, szPath, MAX_PATH);
STARTUPINFO startupInfo;
PROCESS_INFORMATION procInfo;
memset(&startupInfo,0x00,sizeof(STARTUPINFO));
startupInfo.cb = sizeof(STARTUPINFO);
::CreateProcess(szPath,NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&startupInfo,&procInfo);
5.只运行一个实例
HANDLE m_hMutex = CreateMutex(NULL, FALSE, _T("AetasServer"));
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox(L"程序名称,已经运行");
CloseHandle(m_hMutex);
m_hMutex = NULL;
return FALSE;
}
6.链接到库文件
#pragma comment(lib, "winspool.lib")
7.在窗口程序中输出信息到控制台
在程序开始出加入:
#include <io.h>
#include <fcntl.h>
void InitConsole()
{
int nRet= 0;
FILE* fp;
AllocConsole();
nRet= _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
fp = _fdopen(nRet, "w");
*stdout = *fp;
setvbuf(stdout, NULL, _IONBF, 0);
}
退出时调用
FreeConsole(VOID);