VC API常用函数简单例子大全(6)

2019-04-16 15:31

函数定义:BOOL ReadProcessMemory(HANDLE hProcess,PVOID pvAddressRemote,PVOID pvBufferLocal,DWORD dwSize,PDWORD pdwNumBytesRead);总共四个参数

第一个参数hProcess是远程进程句柄,被读取者 。第二个pvAddressRemote是远程进程中内存地址。 具体从何处读取

pvBufferLocal是本地进程中内存地址. 函数将读取的内容写入此处 ,dwSize是要读取的字节数。要读取多少

pdwNumBytesRead是实际读取的内容(函数执行后,实际读了多少字节,将存储在该变量里) 远程进程的内存地址是什么意思呢,比如我现在定义一个变量a,int a;就是了,大家知道int型是占四个字节的,也就是说如果a变量所占的内存起始地址是0x1234,那么变量a就占用0x1234,0x1235,0x1236,0x1237这四个字节,这四个字节的内容决定了a变量的值。 好了知道了这个,我们就来举个例子,读取另一个进程里一个变量的值:需设计两个程序,一个用于读(Read)一个用于被读(BeRead);

那么要如何获得另一个进程中一个变量的地址呢?这里我们用一个简单的方法,让另一个进程自己去获取,然后输出地址值。

被读的程序代码如下:假设该进程名为:BeRead.exe #include int main()

{

int a=10;//要读取的变量。

printf(\输出这个变量的起始地址,假设输出为12ff7c while(1) {

Sleep(1000); } return 0; }

必须先让这个程序运行,然后根据输出的地址值,才能在下面的程序填入地址值。 读取的程序代码如下: #include #include #include int main() {

//先要获取进程句柄,如何获取,参照TerminateProcess函数,结束一个进程

HANDLE ReProcess;

PROCESSENTRY32 pe32;

pe32.dwSize=sizeof(pe32);

HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); BOOL bMore=::Process32First(hProcessSnap,&pe32); while(bMore) {

if(strcmp(pe32.szExeFile,\如果是BeRead.exe {

ReProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);//获取该进程句柄 break;

}

bMore=Process32Next(hProcessSnap,&pe32);

}

int *ReAddress=(int *)0x12ff7c;//要读取的内存的地址值

int *p=new int;

unsigned long size;

ReadProcessMemory(ReProcess,ReAddress,p,4,&size);//读取BeRead进程的内存 printf(\输出读取来的值 return 0; }

37:WriteProcessMemory根据进程句柄写入相应的一段内存(写入其它

进程里的内存)

这个函数里的参数跟ReadProcessMemory函数参数意思一样,只不过一个是写,一个是读。 下面直接举个例子,形式跟读内存函数的例子一样。 被写的程序代码如下:假设该进程名为:BeWrite.exe #include int main() {

int a=10;

printf(\假设输出为12ff7c

while(1) {

printf(\每隔一秒输出,查看值有没有改变 Sleep(1000); }

return 0; }

写入的代码如下: #include #include #include int main()

{

HANDLE ReProcess;

PROCESSENTRY32 pe32;

pe32.dwSize=sizeof(pe32);

HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); BOOL bMore=::Process32First(hProcessSnap,&pe32); while(bMore)

{

if(strcmp(pe32.szExeFile,\ {

ReProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID); break;

}

bMore=Process32Next(hProcessSnap,&pe32); }

int *ReAddress=(int *)0x12ff7c;

int *p=new int; *p=300;

unsigned long size;

WriteProcessMemory(ReProcess,ReAddress,p,4,&size); return 0; }

38:CreateThread创建一个线程(多线程)

线程是什么意思呢,代码是由线程来执行的,一个程序默认只有一个线程(主线程),打个比方,线程就好比一个人,而不同功能的代码或函数就好是一件件不同的事情,如洗碗,洗衣服,擦地。一个人要把这几种事情做完,可以有好几种方案,第一种就是,洗完碗,就去洗衣服,衣服洗完了,再去擦地。第二种就是:洗一分钟碗,再去洗一分钟衣服,再去擦一分钟,然后又去洗一分钟衣服.......直到做完。好了,现在你可以再创造一个人帮你做事,创造这个人后,你就叫他洗衣服,而你就洗碗,这样两件事就可以同时被做了。而这里的创造一个人指的就是CreateThread函数。

函数定义:HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);

该函数有六个参数,第一个参数不用管它,填NULL,第二个参数dwStackSize用于新线程的初始堆栈大小,默认为0,第三个lpStartAddress填函数名(指标),但这个函数必须是这种固定格式的DWORD _stdcall ThreadProc(LPVOID lpParameter),新的线程将会执行这个函数里面的代码,直到函数结束,线程死亡。第四个lpParameter是一自定义参数,用户可以通过这个参数,传递需要的类型,这个参数与线程函数的参数相对应。第五个dwCreationFlags填0表示立即执行,如果是CREATE_SUSPENDED表示挂起,直到用ResumeThread函数唤醒。第六个lpThreadId填NULL就行了。

现举个例子,两个线程同时每隔一秒输出一个数字,也就是一秒会有两数字输出。 #include #include

DWORD _stdcall ThreadProc(LPVOID lpParameter)//线程执行函数 {

int si=100; while(si>0)

{

printf(\子线程输出数字:%d\\n\ Sleep(1000); }

return 0; }

int main() {

int mi=0;

CreateThread(NULL,0,ThreadProc,NULL,0,NULL);//创建一个线程,去执行ThreadProc函数

while(mi<100) {

printf(\主线程输出数字:%d\\n\ Sleep(1000); }

return 0; }

39:GetCurrentProcessId获得当前进程ID

DWORD currentPID;

currentPID=::GetCurrentProcessId();//返回进程ID号 cout<

40:CreateCompatibleDC创建一个兼容的内存设备上下文(DC)

简单的来说,就是复制一个模一样的DC。就把窗口看成一幅幅图画,窗口有大有小,里面的内容也不一样(颜色值),每个像素点的颜色值可能不一样,所以就用设备上下文来描述每个窗口的信息,对于DC具体是怎样描述设备上下文的,我们暂时还不需要知道,只要了解这个概念就行了。这个窗口信息,获得一个窗口设备上下文,就用GetDC函数就行了,如HDC hDC=GetDC(hWnd);而CreateCompatibleDC的作用是根据一个设备上下文,再创建一个兼容的设备上下文,如 HDC mDC=CreateCompatibleDC(hDC)。这样mDC里的信息就跟hDC里的一样,那这有什么用呢?这个将会在后面的BitBltl输出一个位图(合并两个DC)函数里会用到。

41:GetObject获取一个对象信息(如位图,图标,光标)

函数定义:int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject); 第一个参数hgdiobj是对象句柄,第二个参数cbBuffer是待写入lpvObject指针指向缓存区数据大小,第三个参数lpvObject是一个指针,指向一个缓存区。

这里举一个获取位图的信息,获取位图的大小,假设E盘下有一个aa.bmp的位图文件,输出位图的宽高 #include #include int main() {

BITMAP bmInfo;//这个结构存储位图信息 HBITMAP bmp;

bmp=(HBITMAP)LoadImage(NULL,\ GetObject(bmp,sizeof(BITMAP),&bmInfo);

printf(\位图宽:%d,位图高:%d\\n\ return 0; }

42:BitBlt在窗口输出一个位图

其实倒不如说这个BitBlt函数是拷贝一个设备上下文(DC),或者合并两个窗口,再延伸一下,合并两个图片?也并无不可,往大了说,窗口难道不是图片吗?用截屏软件,把窗口


VC API常用函数简单例子大全(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:植物地理学复习题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: