当前位置:  编程技术>c/c++/嵌入式
本页文章导读:
    ▪GDI+ 图像平铺      最近在做表格,需要用的图片的平铺就上网找点了资料做了下整理方法1.   HDC hdc=GetDC(m_HWND);  Gdiplus::Image* pImage=Gdiplus::Image::FromFile(L"gridhead.png",true); Gdiplus:: Graphics graphics(hdc); Gdiplus:: Ima.........
    ▪C++析构函数、构造函数、虚函数关系      析构函数(destructor)也是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个“~”符号。 在C++中“~”是位取反运算符,从这点也可以想到:析构.........
    ▪[转]远程线程注入      http://www.vckbase.com/index.php/wv/1653//为了简化代码,下面程序中去掉了对出错处理的代码,实际应用中应该考虑程序运行时可能的出错:#include "stdafx.h"static PIMAGE_NT_HEADERS nt_header;#define IMAGESIZE (.........

[1]GDI+ 图像平铺
    来源:    发布时间: 2013-10-17

最近在做表格,需要用的图片的平铺

就上网找点了资料

做了下整理

方法1.

   HDC hdc=GetDC(m_HWND);
  Gdiplus::Image* pImage=Gdiplus::Image::FromFile(L"gridhead.png",true);
Gdiplus:: Graphics graphics(hdc);
Gdiplus:: ImageAttributes ImgAtt;
ImgAtt.SetWrapMode(Gdiplus:: WrapModeTileFlipXY);
Gdiplus:: RectF rcDrawRect;//目标图像的RECT
rcDrawRect.X=0;
rcDrawRect.Y=0;
rcDrawRect.Width=100;
rcDrawRect.Height=30;
graphics.DrawImage(pImage,rcDrawRect,0,0,1,30,Gdiplus:: UnitPixel,&ImgAtt);
ReleaseDC(m_HWND,hdc);

方法2.

  Gdiplus::Image* pImage=Gdiplus::Image::FromFile(L"gridhead.png",true);
  TextureBrush headbrush(pImage, WrapModeTile );
  graphics.FillRectangle(&headbrush, RectF(0, 0,100,30));

 

本文链接


    
[2]C++析构函数、构造函数、虚函数关系
    来源:    发布时间: 2013-10-17

析构函数(destructor)也是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个“~”符号。

 

在C++中“~”是位取反运算符,从这点也可以想到:析构函数是与构造函数作用相反的函数。当对象的生命期结束时,会自动执行析构函数。

 

具体地说如果出现以下几种情况,程序就会执行析构函数:

①如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。

 

②static局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。

#include <string>
#include <iostream>

using namespace std;

class Box
{
public:
~Box()
{
cout <<"Destructed called" <<height<<endl;
}
Box(int h=10,int w=12,int len=3):height(h),width(w),length(len){}

int volume();
private:
int height;
int width;
int length;
};

int Box::volume()
{
return (height * width * length);
}
int main()
{
static Box a[2]={Box(1,2,3),Box(2,3,4)};

cout <<"The volume a[0] is" <<a[0].volume()<<endl;
cout <<"The volume a[1] is" <<a[1].volume()<<endl;

//system("pause");

return 0;
}

 运行结果:

如果执行注释的那行,结果又是如何??自己去尝试一下!!

③如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数) 时,调用该全局对象的析构函数。

一个很典型的例子:

 

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

class CDemo
{
public:
CDemo(const char *str);
~CDemo();

private:
char name[20];
};

CDemo::CDemo(const char*str)
{
strcpy(name,str);
cout <<"Construction Called For "<<name <<endl;
}

CDemo::~CDemo()
{
cout <<"Destruction Called For " <<name <<endl;
//printf(" Destruction called for %s\n",name);
}

void func()
{
static CDemo StaticObject="Staticobject";
CDemo *pHeapObjectInFunc = new CDemo("heapobjectinfunc");

CDemo LocalObjectInFunc("localobjectinfunc");

cout <<"inside func"<<endl;
}

static CDemo GlobleObject("globeobject");

int main()
{
CDemo LocalObjectInMain("localobjectinmain");

CDemo *pHeapObjectInMain = new CDemo("heapobjectinmain");

cout <<"In main,before calling func"<<endl;

func();

cout <<"In main,after calling func\n";
exit(1);
return 0;
}

 

先不要看运行结果,跟大家一起分析一下代码运行的过程:
根据代码数据类型大致分为三个部分:静态全局变量(static CDemo GlobleObject),静态局部变量(static CDemo StaticObject),普通局部变量(CDemo LocalObjectInMain.....);

1、由于静态全局对象的构造函数将在main函数之前运行,则析构在main函数之后运行

 


    
[3][转]远程线程注入
    来源:    发布时间: 2013-10-17
http://www.vckbase.com/index.php/wv/1653
//为了简化代码,下面程序中去掉了对出错处理的代码,实际应用中应该考虑程序运行时可能的出错:
#include "stdafx.h"
static PIMAGE_NT_HEADERS nt_header;
#define IMAGESIZE (nt_header->OptionalHeader.SizeOfImage)
#define EXPORT_TABEL (nt_header->OptionalHeader.DataDirectory[0].VirtualAddress)
#define RELOC_TABEL (nt_header->OptionalHeader.DataDirectory[5].VirtualAddress)
static void RelocCode (PBYTE Image, LPBYTE InjectBase) // 完成代码的重定位
{
DWORD Rva = 0, RvaCount = 0, RelocOffset=0;
WORD *Offset = NULL;
LPBYTE RelocTable = Image + RELOC_TABEL; //重定位表位置
PIMAGE_BASE_RELOCATION basereloc= (PIMAGE_BASE_RELOCATION) RelocTable;
RelocOffset= (DWORD)InjectBase - nt_header ->OptionalHeader.ImageBase; //重定位表偏移
while(basereloc ->VirtualAddress != NULL)// 遍历重定位表,修正需要重定位的代码
{
Offset = (WORD*)(RelocTable + sizeof(IMAGE_BASE_RELOCATION));
RvaCount = (basereloc ->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / 2;
for(DWORD i=0; iVirtualAddress + (DWORD)Image;
*(DWORD*)Rva += RelocOffset;//RVA加上修正量进行修正
}
RelocTable += basereloc ->SizeOfBlock;//指向下一页重定位信息处
basereloc = (PIMAGE_BASE_RELOCATION) RelocTable;
}
}
int LoadAPI(LPBYTE InjectBase)// 用于完成API函数的导入,参数为要插入代码处地址
{
PIMAGE_DOS_HEADER dos_h = (PIMAGE_DOS_HEADER) InjectBase;
PIMAGE_NT_HEADERS nt_h = (PIMAGE_NT_HEADERS)(InjectBase + dos_h->e_lfanew);
PIMAGE_IMPORT_DESCRIPTOR import_d = (PIMAGE_IMPORT_DESCRIPTOR)
(InjectBase + nt_h->OptionalHeader.DataDirectory[1].VirtualAddress);
for( ; import_d->OriginalFirstThunk != 0; import_d++)//遍历导入表
{
HMODULE hDll = LoadLibrary((LPCSTR)(InjectBase + import_d->Name));
//上面能直接引用LoadLibrary是由于本地和远程进程中该函数地址都是相同的
if(hDll == NULL)
return 0;
PIMAGE_THUNK_DATA Origin = (PIMAGE_THUNK_DATA)(InjectBase +import_d->OriginalFirstThunk);
PIMAGE_THUNK_DATA First = (PIMAGE_THUNK_DATA)(InjectBase + import_d->FirstThunk);
LPCSTR Name = NULL;
PIMAGE_IMPORT_BY_NAME Import_name = NULL;
for(; Origin->u1.Ordinal != 0; Origin++, First++)
{
if(Origin->u1.Ordinal & IMAGE_ORDINAL_FLAG)
Name = (LPCSTR)IMAGE_ORDINAL(Origin->u1.Ordinal);
else
{
Import_name = (PIMAGE_IMPORT_BY_NAME)(InjectBase + (DWORD)( Origin->u1.AddressOfData));
Name = (LPCSTR)Import_name->Name;
}
First->u1.Function = (DWORD * )GetProcAddress(hDll, Name);
//上面能直接引用GetProcAddress是由于本地和远程进程中该函数地址都是相同的
if(First->u1.Function == NULL)
return 0;
}
}
return 1;
}
DWORD RemoteThread_Main(HINSTANCE hInstance) //远程要执行的代码,在这里只演示MessageBox
{
::MessageBox (0,"远程线程插入成功!","远程线程",0);
return 1;
}
DWORD ThreadEntry(LPBYTE ImageBase) /*** 远程线程入口 ***/
{
if(LoadAPI(ImageBase))//先完成API函数的导入工作
RemoteThread_Main ((HINSTANCE)ImageBase); //执行函数RemoteThread_Main中的代码
return 1;
}
static DWORD GetTargetProcessId() //获取远程进程 PID
{
DWORD ProcessId = 0;
HWND hWnd = FindWindow("Progman", "Program Manager");//获取资源管理器进程PID
if(hWnd != NULL)
GetWindowThreadProcessId(hWnd, &ProcessId);
return ProcessId;
}
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
LPBYTE InjectPoint = NULL, Module = NULL, NewModule = NULL,Param =NULL;
HANDLE hProcess = NULL, hThread = NULL;
DWORD ProcessId = 0, ImageSize = 0;
LPTHREAD_START_ROUTINE RemoteEntryPoint =
    
最新技术文章:
▪C++单例模式应用实例
▪C++设计模式之迭代器模式
▪C++实现动态分配const对象实例
▪C++设计模式之中介者模式
▪C++设计模式之备忘录模式
▪C++插入排序算法实例
▪C++冒泡排序算法实例
▪C++选择排序算法实例
▪C++归并排序算法实例
▪C++设计模式之观察者模式
▪C++中复制构造函数和重载赋值操作符总结
▪C++设计模式之状态模式
▪C++设计模式之策略模式
▪C++设计模式之访问者模式
▪C++设计模式之模板方法模式
▪C++实现下载的代码
▪C++模板之特化与偏特化详解
▪C++实现查壳程序代码实例
▪C语言、C++内存对齐问题详解
▪C语言、C++中的union用法总结
▪C++基于CreateToolhelp32Snapshot获取系统进程实例
▪C++中memcpy和memmove的区别总结
▪C++通过TerminateProess结束进程实例
▪C++内存查找实例
▪C++实现CreatThread函数主线程与工作线程交互的...
▪C++设计模式之桥接模式
▪C++中关键字Struct和Class的区别
▪C++设计模式之组合模式
▪C++ COM编程之什么是组件?
▪C++ COM编程之什么是接口?
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3