C++ 映射文件不显示信息
我制作了两个程序,你可以在下面找到 第一项统计所有下班后有代码的流程:C++ 映射文件不显示信息,c++,winapi,process,memory-mapped-files,C++,Winapi,Process,Memory Mapped Files,我制作了两个程序,你可以在下面找到 第一项统计所有下班后有代码的流程: #include "stdafx.h" #include <windows.h> #include <Tlhelp32.h> #include <iostream> #include <list> #include <stdio.h> #include <conio.h> #include <tchar.h> // http:
#include "stdafx.h"
#include <windows.h>
#include <Tlhelp32.h>
#include <iostream>
#include <list>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
// http://www.cplusplus.com/forum/articles/16820/
// http://stackoverflow.com/questions/3298569/difference-between-mbcs-and-utf-8-on-windows
// http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc
using namespace std;
int main(void)
{ //snapshot la toate procesele din sistem
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 proc32;
TCHAR names[MAX_PATH]=L""; //wchar_t pentru ca folosim Unicode
if(hSnap == INVALID_HANDLE_VALUE)
{
cout<<"invalid handle value error!\n";
}
//setez dimensiunea structurii
proc32.dwSize = sizeof(PROCESSENTRY32);
//get info despre primul proces(se va afisa in do...while)
if(!Process32First(hSnap, &proc32))
{
cout<<"Tread32First() error!\n";
CloseHandle(hSnap);
}
//cauta in restul proceselor
//daca nr. threaduri<3, introdu in fisierul mapat
do
{
if(proc32.cntThreads < 3)
{
//cout<<"Current process id(adica programul A): "<<GetCurrentProcessId()<<"\n";
wcout<<L"Process Name: "<<proc32.szExeFile<<"\n";
cout<<"Process ID: " <<proc32.th32ProcessID<<"\n";
cout<<"Thread Count: "<<proc32.cntThreads<<"\n"<<endl;
//exclud procesul curent, nu vreau sa-l termin
//includ celelalte procese in string, separate de newline
if(GetCurrentProcessId()!=proc32.th32ProcessID)
{ // sprintf(pids,"%d",proc32.th32ProcessID);
lstrcat(names, proc32.szExeFile);
lstrcat(names, L"\n");
}
}
}while(Process32Next(hSnap, &proc32));//cat timp mai sunt procese in snapshot
//inchid handle la snapshot
CloseHandle(hSnap);
//afisez string-ul de procese
wcout<<names;
//scriu in fisierul mapat
HANDLE hMapFile;
LPCTSTR pBuf;
TCHAR szName[]=TEXT("Global\\mapFile");
//il creez
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
256, // maximum object size (low-order DWORD)
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not create file mapping object (%d).\n"),
GetLastError());
return 1;
}
//fac fisierul utilizabil
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
256);
if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
//scriu in el
CopyMemory((PVOID)pBuf, names, (_tcslen(names) * sizeof(TCHAR)));
//deschid al doilea proces care va citi din fisier si inchide procesele
STARTUPINFO startupinfo ;
PROCESS_INFORMATION pinfo ;
ZeroMemory( &startupinfo, sizeof(startupinfo) );
startupinfo.cb = sizeof(startupinfo);
ZeroMemory( &pinfo, sizeof(pinfo) );
//creez noul proces
if(!CreateProcess(L"b.exe", NULL, NULL, NULL, false, NORMAL_PRIORITY_CLASS,
NULL, NULL, &startupinfo, &pinfo))
{
_tprintf(TEXT("Eroare la create process (%d).\n"),
GetLastError());
return 1;
}
// blochez A pana se termina B
WaitForSingleObject(pinfo.hProcess, INFINITE);
//unmap
UnmapViewOfFile(pBuf);
//inchid handle la map
CloseHandle(hMapFile);
getchar();
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
// http://www.cplusplus.com/forum/articles/16820/
// http://stackoverflow.com/questions/3298569/difference-between-mbcs-and-utf-8-on-windows
// http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc
使用名称空间std;
内部主(空)
{//系统中的烤面包程序快照
HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);
PROCESSENTRY32-proc32;
TCHAR names[MAX_PATH]=L”“;//wchar_t pentru ca folosim Unicode
if(hSnap==无效的句柄值)
{
cout第一个进程在启动第二个进程之前关闭MMF句柄-当它尝试读取它时,它已经消失了。在不关闭句柄的情况下运行它,并且仍然不打印。@geogeirimiciuc如果第一个程序在不关闭句柄的情况下终止,Windows将为您关闭它。尝试添加睡眠(无限)
在第一个程序中的CopyMemory之后,我决定将所有内容添加到我的主函数中,它成功了。不过,不使用函数很烦人。
/*Creati 2 programe:
1. Primul va enumera toate procesele din sistem care au mai putin de 3 fire de executie si le va
transmite, printr-un fisier mapat in memorie, programului 2
2. Al doilea program, la initializare, isi va seta privilegiul SE_DEBUG_NAME si va omori toate
procesele transmise de programul 1.
*/
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <iostream>
using namespace std;
#define BUF_SIZE 256
TCHAR szName[]=TEXT("mapFile");
int main()
{
HANDLE hMapFile;
LPCTSTR pBuf;
//deschid fisierul mapat
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szName); // name of mapping object
if (hMapFile == NULL)
{
std::cout<<"Could not open file mapping object.\n";
return 1;
}
//asociez un handle
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
std::cout<<"Could not map view of file.\n";
CloseHandle(hMapFile);
return 1;
}
//inchid procesele
MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
#include "stdafx.h"
#include <windows.h>
#include <Tlhelp32.h>
#include <iostream>
#include <list>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
// http://www.cplusplus.com/forum/articles/16820/
// http://stackoverflow.com/questions/3298569/difference-between-mbcs-and-utf-8-on-windows
// http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc
using namespace std;
int main(void)
{ //snapshot la toate procesele din sistem
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 proc32;
TCHAR names[MAX_PATH]=L""; //wchar_t pentru ca folosim Unicode
if(hSnap == INVALID_HANDLE_VALUE)
{
cout<<"invalid handle value error!\n";
}
//setez dimensiunea structurii
proc32.dwSize = sizeof(PROCESSENTRY32);
//get info despre primul proces(se va afisa in do...while)
if(!Process32First(hSnap, &proc32))
{
cout<<"Tread32First() error!\n";
CloseHandle(hSnap);
}
//cauta in restul proceselor
//daca nr. threaduri<3, introdu in fisierul mapat
do
{
if(proc32.cntThreads < 3)
{
//cout<<"Current process id(adica programul A): "<<GetCurrentProcessId()<<"\n";
wcout<<L"Process Name: "<<proc32.szExeFile<<"\n";
cout<<"Process ID: " <<proc32.th32ProcessID<<"\n";
cout<<"Thread Count: "<<proc32.cntThreads<<"\n"<<endl;
//exclud procesul curent, nu vreau sa-l termin
//includ celelalte procese in string, separate de newline
if(GetCurrentProcessId()!=proc32.th32ProcessID)
{ // sprintf(pids,"%d",proc32.th32ProcessID);
lstrcat(names, proc32.szExeFile);
lstrcat(names, L"\n");
}
}
}while(Process32Next(hSnap, &proc32));//cat timp mai sunt procese in snapshot
//inchid handle la snapshot
CloseHandle(hSnap);
//afisez string-ul de procese
wcout<<names;
//scriu in fisierul mapat
HANDLE hMapFile;
LPCTSTR pBuf;
TCHAR szName[]=TEXT("Global\\mapFile");
//il creez
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
256, // maximum object size (low-order DWORD)
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not create file mapping object (%d).\n"),
GetLastError());
return 1;
}
//fac fisierul utilizabil
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
256);
if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
//scriu in el
CopyMemory((PVOID)pBuf, names, (_tcslen(names) * sizeof(TCHAR)));
//deschid al doilea proces care va citi din fisier si inchide procesele
STARTUPINFO startupinfo ;
PROCESS_INFORMATION pinfo ;
ZeroMemory( &startupinfo, sizeof(startupinfo) );
startupinfo.cb = sizeof(startupinfo);
ZeroMemory( &pinfo, sizeof(pinfo) );
//creez noul proces
if(!CreateProcess(L"b.exe", NULL, NULL, NULL, false, NORMAL_PRIORITY_CLASS,
NULL, NULL, &startupinfo, &pinfo))
{
_tprintf(TEXT("Eroare la create process (%d).\n"),
GetLastError());
return 1;
}
// blochez A pana se termina B
WaitForSingleObject(pinfo.hProcess, INFINITE);
//unmap
UnmapViewOfFile(pBuf);
//inchid handle la map
CloseHandle(hMapFile);
getchar();
}