获取进程信息:使用Windows API函数EnumProcesses枚举系统中所有进程的ID,然后使用OpenProcess函数打开进程句柄,调用GetModuleFileNameEx函数获取进程名。
获取进程图标:使用Windows API函数ExtractIconEx获取进程程序文件的图标资源,然后使用GetIconInfo函数获取图标信息,使用CreateIconIndirect函数创建图标。
在MFC界面上显示进程名和图标:在对话框中添加一个列表框控件,使用InsertItem函数向列表框中添加项,然后使用SetItemText函数设置项的文本,使用SetItemImage函数设置项的图标。
示例代码如下:
C++
Copy code
// 遍历进程
void CProcessDlg::EnumerateProcesses()
{
DWORD aProcesses[1024], cbNeeded, cProcesses
if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
return
cProcesses = cbNeeded / sizeof(DWORD)
for (int i = 0i <cProcessesi++)
{
// 打开进程句柄
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i])
if (!hProcess) continue
// 获取进程名
TCHAR szProcessName[MAX_PATH] = { 0 }
if (GetModuleFileNameEx(hProcess, NULL, szProcessName, MAX_PATH))
{
// 获取进程图标
HICON hIcon = NULL
int nIcons = ExtractIconEx(szProcessName, -1, NULL, &hIcon, 1)
if (nIcons == 1 &&hIcon)
{
ICONINFO info
GetIconInfo(hIcon, &info)
// 创建图标
HICON hNewIcon = CreateIconIndirect(&info)
if (hNewIcon)
{
// 添加项到列表框
int nIndex = m_listProcess.InsertItem(0, szProcessName)
m_listProcess.SetItemText(nIndex, 1, _T("描述信息"))
m_listProcess.SetItemImage(nIndex, (LPARAM)hNewIcon)
}
DestroyIcon(hIcon)
DestroyIcon(hNewIcon)
}
}
CloseHandle(hProcess)
}
}
这段代码会遍历系统中所有进程,获取进程名和图标信息,并将它们添加到对话框的列表框中。注意需要在对话框的OnInitDialog函数中调用此函数,以便在对话框初始化时显示进程信息。
#include <windows.h>#include <tchar.h>
int main()
{
STARTUPINFO si
PROCESS_INFORMATION pi
SECURITY_ATTRIBUTES sa
HANDLE hstderr
TCHAR cmdLine[] = _T("gcc.exe -o123.exe -s 123.c")
ZeroMemory(&sa, sizeof sa)
sa.nLength = sizeof sa
sa.bInheritHandle = TRUE
hstderr = CreateFile(_T("gccout.txt"), GENERIC_WRITE, 0, &sa, CREATE_ALWAYS, 0, 0)
ZeroMemory(&si, sizeof si)
si.cb = sizeof si
si.dwFlags = STARTF_USESTDHANDLES
si.hStdOutput = INVALID_HANDLE_VALUE
si.hStdError = hstderr
si.hStdInput = INVALID_HANDLE_VALUE
CreateProcess(0, cmdLine, 0, 0, TRUE, 0, 0, 0, &si, &pi)
CloseHandle(hstderr)
CloseHandle(pi.hThread)
WaitForSingleObject(pi.hProcess, INFINITE)
CloseHandle(pi.hProcess)
return 0
}
代码已调试通过,还没加入出错判断,仅供参考
注:gcc在完全正常编译正常的情况下不会产生输出的,此时文件内容为空。
然后,gcc的环境你要配置好,path环境变量啊那些什么什么东西。mingw的话有一个mingwvars是专业给你干这种事用的
MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务
1、WIN的API函数CreateThread
HANDLE CreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes, // SD
DWORDdwStackSize,// initial stack size
LPTHREAD_START_ROUTINElpStartAddress,// thread function
LPVOIDlpParameter, // thread argument
DWORDdwCreationFlags,// creation option
LPDWORDlpThreadId// thread identifier
)
//lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。
dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。
lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (LPVOID lpParam) ,格式不正确将无法调用成功。
lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
dwCreationFlags :线程标志,可取值如下
(1)CREATE_SUSPENDED-----创建一个挂起的线程,
(2)0---------------------------------表示创建后立即激活。
lpThreadId:保存新线程的id。
2、MFC的全局函数AfxBeginThread
CWinThread* AfxBeginThread( AFX_THREADPROCpfnThreadProc, LPVOIDpParam, intnPriority= THREAD_PRIORITY_NORMAL, UINTnStackSize= 0, DWORDdwCreateFlags= 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs= NULL )
//用于创建工作者线程 其中pfnThreadProc指向线程函数 pParam为传递给线程函数的参数
CWinThread* AfxBeginThread( CRuntimeClass*pThreadClass, intnPriority= THREAD_PRIORITY_NORMAL, UINTnStackSize= 0, DWORDdwCreateFlags= 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs= NULL )
//用于创建用户界面线程 其中pThreadClass为CWinThread派生对象的RUNTIME_CLASS
3、MFC的CWinThread类的CreateThreat成员函数
BOOL CreateThread( DWORD dwCreateFlags = 0, UINT nStackSize = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL )
//CWinThread类支持工作者线程和用户界面线程 可以将一个CWinThread派生类的CRUNTIMECLASS的指针作为参数传递给AfxBeginThread函数以创建一个用户界面线程 CWinThread类的CreateThread成员函数创建一个调用进程的地址空间中执行的线程
VC 6.0 创建线程的三种方法
CreateThread/ExitThread
_beginthreadex/_endthreadex
AfxBeginThread /AfxEndThread
对以上三种方式的选择:
1.在使用了MFC的程序中使用AfxBeginThread函数或者CWinThread::CreateThread函数创建线程。
2.在非MFC工程中,如果要创建多线程,建议使用_beginthreadex
3.避免使用CreateThread函数。不使用_beginthread.
4.线程内部退出函数使用与创建函数配套的函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)