我想杀掉任务栏里面的QQ进程,编写了下面一段程序,
结果Compile的时候没有问题,在我点击Build的时候出现了下面的错误提示。
网上也有很多介绍这个错误的,但是说法各不一致,我试了好多种,最终还是决定到这里来请教一下大侠。
望指点。Compiling...
111206_KillProcess_taskmgr.cpp
f:\c workspace\111206_killprocess_taskmgr\processnametoid.h(16) : error C2146: syntax error : missing ';' before identifier 'GetProcessID'
f:\c workspace\111206_killprocess_taskmgr\processnametoid.h(16) : error C2501: 'DWORD' : missing storage-class or type specifiers
f:\c workspace\111206_killprocess_taskmgr\processnametoid.h(21) : error C2146: syntax error : missing ';' before identifier 'm_hSnapshot'
f:\c workspace\111206_killprocess_taskmgr\processnametoid.h(21) : error C2501: 'HANDLE' : missing storage-class or type specifiers
f:\c workspace\111206_killprocess_taskmgr\processnametoid.h(21) : error C2501: 'm_hSnapshot' : missing storage-class or type specifiers
F:\C Workspace\111206_KillProcess_taskmgr\111206_KillProcess_taskmgr.cpp(8) : error C2146: syntax error : missing ';' before identifier 'KillJob'
F:\C Workspace\111206_KillProcess_taskmgr\111206_KillProcess_taskmgr.cpp(8) : error C2501: 'BOOL' : missing storage-class or type specifiers
F:\C Workspace\111206_KillProcess_taskmgr\111206_KillProcess_taskmgr.cpp(8) : fatal error C1004: unexpected end of file found
Error executing cl.exe.// ProcessNametoID.h: interface for the CProcessNametoID class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_PROCESSNAMETOID_H__4217BFFA_FB96_4DAF_A665_3EF82774CD57__INCLUDED_)
#define AFX_PROCESSNAMETOID_H__4217BFFA_FB96_4DAF_A665_3EF82774CD57__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CProcessNametoID
{
public:
DWORD GetProcessID( char* m_cName );
CProcessNametoID();
virtual ~CProcessNametoID();private:
HANDLE m_hSnapshot;
};#endif // !defined(AFX_PROCESSNAMETOID_H__4217BFFA_FB96_4DAF_A665_3EF82774CD57__INCLUDED_) // ProcessNametoID.cpp: implementation of the CProcessNametoID class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "ProcessNametoID.h"
#include <Tlhelp32.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CProcessNametoID::CProcessNametoID()
{
this ->m_hSnapshot = NULL;
}CProcessNametoID::~CProcessNametoID()
{}DWORD CProcessNametoID::GetProcessID(char *m_cName)
{
DWORD m_dwPid = 0;
BOOL m_bStatus = false;
PROCESSENTRY32 m_ppe;
::memset( &m_ppe, 0, sizeof( PROCESSENTRY32 ) );
m_ppe.dwSize = sizeof( PROCESSENTRY32 );
__try
{
this ->m_hSnapshot = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); //创建进程快照
if ( this ->m_hSnapshot == NULL )
{
__leave;
} m_bStatus == ::Process32First( this ->m_hSnapshot, &m_ppe ); //开始枚举进程
int a = ::GetLastError();
while ( m_bStatus )
{
char *current;
current = m_ppe.szExeFile();
if ( lstrcmpi( m_cName, current ) ) //忽略大小写
{
m_bStatus::Process32Next( this ->m_hSnapshot, &m_ppe );
}
else
{
m_dwPid = m_ppe.th32ProcessID;
m_bStatus = false;
}
}
}
__finally
{
::CloseHandle( this ->m_hSnapshot );
return m_dwPid;
}
}// 111206_KillProcess_taskmgr.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include "ProcessNametoID.h"
BOOL KillJob( CString strProcessName, CString strJobName )int main()//int argc, char* argv[] )
{
BOOL bRet = FALSE;
bRet = KillJob( "QQ.exe", "KillQQ" );
if ( bRet )
MessageBox( NULL, "QQ成功结束!", "提示", MB_OK );
return 0;
}BOOL KillJob( CString strProcessName, CString strJobName )
{
HANDLE hJob = CreateJobObject( NULL, TEXT( strJobName ) ); //建立Job对象
DWORD dwPid = GetProcessID( ( LPTSTR )( LPCTSTR )strProcessName ); //建立QQ进程PID
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, TRUE, dwPid ); //获取QQ进程句柄
if ( !hProcess )
{
MessageBox( "Open process error!" );
return FALSE;
}
AssignProcessToJobObject( hJob, hProcess ); //将进程和对象关联起来
BOOL hRet = TerminateJobObject( hJob, 0 ); //终止作业
if ( !bRet )
return FALSE;
else
return TRUE;
}
结果Compile的时候没有问题,在我点击Build的时候出现了下面的错误提示。
网上也有很多介绍这个错误的,但是说法各不一致,我试了好多种,最终还是决定到这里来请教一下大侠。
望指点。Compiling...
111206_KillProcess_taskmgr.cpp
f:\c workspace\111206_killprocess_taskmgr\processnametoid.h(16) : error C2146: syntax error : missing ';' before identifier 'GetProcessID'
f:\c workspace\111206_killprocess_taskmgr\processnametoid.h(16) : error C2501: 'DWORD' : missing storage-class or type specifiers
f:\c workspace\111206_killprocess_taskmgr\processnametoid.h(21) : error C2146: syntax error : missing ';' before identifier 'm_hSnapshot'
f:\c workspace\111206_killprocess_taskmgr\processnametoid.h(21) : error C2501: 'HANDLE' : missing storage-class or type specifiers
f:\c workspace\111206_killprocess_taskmgr\processnametoid.h(21) : error C2501: 'm_hSnapshot' : missing storage-class or type specifiers
F:\C Workspace\111206_KillProcess_taskmgr\111206_KillProcess_taskmgr.cpp(8) : error C2146: syntax error : missing ';' before identifier 'KillJob'
F:\C Workspace\111206_KillProcess_taskmgr\111206_KillProcess_taskmgr.cpp(8) : error C2501: 'BOOL' : missing storage-class or type specifiers
F:\C Workspace\111206_KillProcess_taskmgr\111206_KillProcess_taskmgr.cpp(8) : fatal error C1004: unexpected end of file found
Error executing cl.exe.// ProcessNametoID.h: interface for the CProcessNametoID class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_PROCESSNAMETOID_H__4217BFFA_FB96_4DAF_A665_3EF82774CD57__INCLUDED_)
#define AFX_PROCESSNAMETOID_H__4217BFFA_FB96_4DAF_A665_3EF82774CD57__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CProcessNametoID
{
public:
DWORD GetProcessID( char* m_cName );
CProcessNametoID();
virtual ~CProcessNametoID();private:
HANDLE m_hSnapshot;
};#endif // !defined(AFX_PROCESSNAMETOID_H__4217BFFA_FB96_4DAF_A665_3EF82774CD57__INCLUDED_) // ProcessNametoID.cpp: implementation of the CProcessNametoID class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "ProcessNametoID.h"
#include <Tlhelp32.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CProcessNametoID::CProcessNametoID()
{
this ->m_hSnapshot = NULL;
}CProcessNametoID::~CProcessNametoID()
{}DWORD CProcessNametoID::GetProcessID(char *m_cName)
{
DWORD m_dwPid = 0;
BOOL m_bStatus = false;
PROCESSENTRY32 m_ppe;
::memset( &m_ppe, 0, sizeof( PROCESSENTRY32 ) );
m_ppe.dwSize = sizeof( PROCESSENTRY32 );
__try
{
this ->m_hSnapshot = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); //创建进程快照
if ( this ->m_hSnapshot == NULL )
{
__leave;
} m_bStatus == ::Process32First( this ->m_hSnapshot, &m_ppe ); //开始枚举进程
int a = ::GetLastError();
while ( m_bStatus )
{
char *current;
current = m_ppe.szExeFile();
if ( lstrcmpi( m_cName, current ) ) //忽略大小写
{
m_bStatus::Process32Next( this ->m_hSnapshot, &m_ppe );
}
else
{
m_dwPid = m_ppe.th32ProcessID;
m_bStatus = false;
}
}
}
__finally
{
::CloseHandle( this ->m_hSnapshot );
return m_dwPid;
}
}// 111206_KillProcess_taskmgr.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include "ProcessNametoID.h"
BOOL KillJob( CString strProcessName, CString strJobName )int main()//int argc, char* argv[] )
{
BOOL bRet = FALSE;
bRet = KillJob( "QQ.exe", "KillQQ" );
if ( bRet )
MessageBox( NULL, "QQ成功结束!", "提示", MB_OK );
return 0;
}BOOL KillJob( CString strProcessName, CString strJobName )
{
HANDLE hJob = CreateJobObject( NULL, TEXT( strJobName ) ); //建立Job对象
DWORD dwPid = GetProcessID( ( LPTSTR )( LPCTSTR )strProcessName ); //建立QQ进程PID
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, TRUE, dwPid ); //获取QQ进程句柄
if ( !hProcess )
{
MessageBox( "Open process error!" );
return FALSE;
}
AssignProcessToJobObject( hJob, hProcess ); //将进程和对象关联起来
BOOL hRet = TerminateJobObject( hJob, 0 ); //终止作业
if ( !bRet )
return FALSE;
else
return TRUE;
}
解决方案 »
- bstr 类型引发的困惑,求助
- mfc 如何先加载web控件再显示对话框
- 刚学网络编程,一个简单的UDP问题,郁闷了我很久(附代码)~~在线等
- 菜鸟问题!! 我想在视图类中调用主框架的成员变量或函数
- 请教:关于存在2个窗口变化的问题
- 字符串转换成数字的问题
- 求《Visual C++数字图像获取、处理及实践应用 》《Visual C++数字图像处理(第二版) 》《数字图像处理学Visual C++实现》《Visual C++数
- 難道CSDN就沒有高手嗎!!!我把Source Code都拿出來了,竟無人能Debug!!!
- 我现在有一个COM DLL,头文件,XXX_i.c都有,如何使用??怎么注册这个COM???!
- 高分请教!如何在ListBox(列表框)中每一项的开始加入一个CheckBox(检查框)!!!!!
- MFC对话框绘制坐标轴和动态曲线的问题VS2010
- opengl 如何画 Nurbs 曲面
//#include "stdafx.h"
#include "afxwin.h"
#include "windows.h"
#include "Tlhelp32.h"HANDLE CreateJobObject(
LPSECURITY_ATTRIBUTES lpJobAttributes, // SD
LPCTSTR lpName // job name
);BOOL AssignProcessToJobObject(
HANDLE hJob, // handle to job
HANDLE hProcess // handle to process
);BOOL TerminateJobObject(
HANDLE hJob, // handle to job
UINT uExitCode // exit code
);typedef HANDLE ( *pcre )( LPSECURITY_ATTRIBUTES, LPCTSTR );
typedef BOOL ( *pass )( HANDLE, HANDLE );
typedef BOOL ( *pter )( HANDLE, HANDLE );HANDLE m_hSnapshot = NULL;DWORD GetProcessID(char *m_cName)
{
DWORD m_dwPid = 0;
BOOL m_bStatus = false;
PROCESSENTRY32 m_ppe;
::memset( &m_ppe, 0, sizeof( PROCESSENTRY32 ) );
m_ppe.dwSize = sizeof( PROCESSENTRY32 );
__try
{
m_hSnapshot = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); //创建进程快照
if ( m_hSnapshot == NULL )
{
__leave;
} m_bStatus = ::Process32First( m_hSnapshot, &m_ppe ); //开始枚举进程
int a = ::GetLastError();
while ( m_bStatus )
{
char *current;
current = m_ppe.szExeFile;
if ( lstrcmpi( m_cName, current ) ) //忽略大小写
{
m_bStatus = ::Process32Next( m_hSnapshot, &m_ppe );
}
else
{
m_dwPid = m_ppe.th32ProcessID;
m_bStatus = false;
}
}
}
__finally
{
::CloseHandle( m_hSnapshot );
return m_dwPid;
}
}BOOL KillJob( CString strProcessName, CString strJobName )
{
HMODULE h;
h = LoadLibrary( "kernel32.dll" );
if( h )
{
pcre cre;
pass ass;
pter ter; cre = ( pcre )::GetProcAddress( h, "CreateJobObject" );
ass = ( pass )::GetProcAddress( h, "AssignProcessToJobObject" );
ter = ( pter )::GetProcAddress( h, "TerminateJobObject" );
if( !cre || !ass || !ter )
{
return FALSE;
}
//HANDLE hJob = ( HANDLE )CreateJobObject( NULL, TEXT( strJobName ) ); //建立Job对象
HANDLE hJob = ( HANDLE )cre( NULL, TEXT( strJobName ) ); //建立Job对象
DWORD dwPid = GetProcessID( ( LPTSTR )( LPCTSTR )strProcessName ); //建立QQ进程PID
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, TRUE, dwPid ); //获取QQ进程句柄
if ( !hProcess )
{
AfxMessageBox( "Open process error!" );
return FALSE;
}
//AssignProcessToJobObject( hJob, hProcess ); //将进程和对象关联起来
ass( hJob, hProcess ); //将进程和对象关联起来
//BOOL bRet = TerminateJobObject( hJob, 0 ); //终止作业
BOOL bRet = ter( hJob, 0 ); //终止作业
if ( !bRet )
{
return FALSE;
}
else
{
return TRUE;
} FreeLibrary( h );
}
else
{
return FALSE;
}
}int main()//int argc, char* argv[] )
{
BOOL bRet = FALSE;
bRet = KillJob( "QQ.exe", "KillQQ" );
if ( bRet )
MessageBox( NULL, "QQ成功结束!", "提示", MB_OK );
return 0;
}
//#include "stdafx.h"
#include "afxwin.h"
#include "windows.h"
#include "Tlhelp32.h"HANDLE CreateJobObject(
LPSECURITY_ATTRIBUTES lpJobAttributes, // SD
LPCTSTR lpName // job name
);BOOL AssignProcessToJobObject(
HANDLE hJob, // handle to job
HANDLE hProcess // handle to process
);BOOL TerminateJobObject(
HANDLE hJob, // handle to job
UINT uExitCode // exit code
);typedef HANDLE ( __stdcall *pcre )( LPSECURITY_ATTRIBUTES, LPCTSTR );
typedef BOOL ( __stdcall *pass )( HANDLE, HANDLE );
typedef BOOL ( __stdcall *pter )( HANDLE, HANDLE );HANDLE m_hSnapshot = NULL;DWORD GetProcessID(char *m_cName)
{
DWORD m_dwPid = 0;
BOOL m_bStatus = false;
PROCESSENTRY32 m_ppe;
::memset( &m_ppe, 0, sizeof( PROCESSENTRY32 ) );
m_ppe.dwSize = sizeof( PROCESSENTRY32 );
__try
{
m_hSnapshot = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); //创建进程快照
if ( m_hSnapshot == NULL )
{
__leave;
} m_bStatus = ::Process32First( m_hSnapshot, &m_ppe ); //开始枚举进程
int a = ::GetLastError();
while ( m_bStatus )
{
char *current;
current = m_ppe.szExeFile;
if ( lstrcmpi( m_cName, current ) ) //忽略大小写
{
m_bStatus = ::Process32Next( m_hSnapshot, &m_ppe );
}
else
{
m_dwPid = m_ppe.th32ProcessID;
m_bStatus = false;
}
}
}
__finally
{
::CloseHandle( m_hSnapshot );
return m_dwPid;
}
}BOOL KillJob( CString strProcessName, CString strJobName )
{
HMODULE h;
h = LoadLibrary( "kernel32.dll" );
if( h )
{
pcre cre;
pass ass;
pter ter; cre = ( pcre )::GetProcAddress( h, "CreateJobObjectA" );
ass = ( pass )::GetProcAddress( h, "AssignProcessToJobObject" );
ter = ( pter )::GetProcAddress( h, "TerminateJobObject" );
if( !cre || !ass || !ter )
{
return FALSE;
}
//HANDLE hJob = ( HANDLE )CreateJobObject( NULL, TEXT( strJobName ) ); //建立Job对象
HANDLE hJob = ( HANDLE )cre( NULL, TEXT( strJobName ) ); //建立Job对象
DWORD dwPid = GetProcessID( ( LPTSTR )( LPCTSTR )strProcessName ); //建立QQ进程PID
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, TRUE, dwPid ); //获取QQ进程句柄
if ( !hProcess )
{
AfxMessageBox( "Open process error!" );
return FALSE;
}
//AssignProcessToJobObject( hJob, hProcess ); //将进程和对象关联起来
ass( hJob, hProcess ); //将进程和对象关联起来
//BOOL bRet = TerminateJobObject( hJob, 0 ); //终止作业
BOOL bRet = ter( hJob, 0 ); //终止作业
if ( !bRet )
{
return FALSE;
}
else
{
return TRUE;
} FreeLibrary( h );
}
else
{
return FALSE;
}
}int main()//int argc, char* argv[] )
{
BOOL bRet = FALSE;
bRet = KillJob( "QQ.exe", "KillQQ" );
if ( bRet )
MessageBox( NULL, "QQ成功结束!", "提示", MB_OK );
return 0;
}调试运行成功
程序的确运行成功了
但是有个问题就是,我这个程序的目的就是想杀QQ进程,为什么一点反应都没有呢?
提示“QQ成功结束”,但实际上,QQ并没有结束啊!
这个程序没有达到我要杀进程的效果呢!
望指点
是不是Kernel32.dll问题啊?
HMODULE h;
h = LoadLibrary( "kernel32.dll" );还想问一下这两句语句是什么用?
而使用CreateJobObject的时候则完全没有任何提示。
这里我也不明白,CreateJobObjectA不是都没有定义吗??
是一个带字符串的函数,不同的工程要对应不同的版本,ansi工程对应CreateJobObjectA,unicode工程对应CreateJobObjectW,所以你用CreateJobObject是不对的。
但是既然不是CreateJobObject这个问题的话,那么会是什么原因呢,我电脑上运行成功,提示“QQ成功结束!”,但实际上QQ还在呢!!求指教! 会是哪里没注意到呢?