gcc/g++基本命令简介

gcc & g++现在是gnu中最主要和最流行的c & c++编译器 。
g++是c++的命令,以.cpp为主,对于c语言后缀名一般为.c。这时候命令换做gcc即可。其实是无关紧要的。
其实编译器是根据gcc还是g++来确定是按照C标准还是C++标准编译链接。

下面以Test.cpp为例:

- 阅读剩余部分 -

windows程序设计之动态链接库

今天很高兴大笑,因为军训结束了,真是累啊,变得黑人一样。。。(泪奔)委屈

切入正题,最近使用到了HOOK技术,就顺便学习了下DLL的知识,不过只是大概地看了下而已,概念性的东西很多,也就只能了解下,还有很多涉及到操作系统层面的,所以看的云里雾里快哭了。最后东拼西凑写了点,便于以后自己学习。

- 阅读剩余部分 -

Hook技术简介

钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。这和前面我博客的窗口子类化都异曲同工,但是Hook可强大多了,我是这两天才开始看的,所以略知皮毛。

- 阅读剩余部分 -

windows下安装,配置gcc编译器

在Windows下使用gcc编译器:


1.首先介绍下MinGW


MinGW是指只用自由软件来生成纯粹的Win32可执行文件的编译环境,它是Minimalist GNU on Windows的略称。

  实际上 MinGW 并不是一个 单纯的C/C++ 编译器,而是一套 GNU 工具集合。除开 GCC 以外,MinGW 还包含有一些其他的 GNU 程序开发工具 (比如 gawk bison 等等)。
开发 MinGW 是为了那些不喜欢工作在 Linux(FreeBSD) 操作系统而留在 Windows 的人提供一套符合 GNU 的 GNU 工作环境。
所以,使用 MinGW 我们就可以像在 Linux 下一样使用 GNU 程序开发工具。
GCC 就是 MinGW 的核心所在,GCC 是一套支持众多计算机程序语言的编译系统,而且在语言标准的实现上是最接近于标准的。并且 GCC 几乎可以移植到目前所有可用的计算机平台。(我的电脑上就还装有 DevKitPro,里面包含 GCC 的 ARM(for GBA/DS/GP32) 和 MIPS(for PSP) 版本。)
GCC 本身不像 VC 那样拥有IDE 界面(在 Windows 上也存在 Dev C++ 之类的支持 MinGW 编译器的 IDE)。源代码编辑你可以选用任何你喜欢的文本编辑器(据说微软的开发人员包括 VC 的开发都不用 VC 所带的 IDE 编辑器,而是选用 GNU 的 VIM 编辑器)。然后使用 make 等工具来进行软件项目的编译、链接、打包乃至发布。而像 cvs(svn) 源代码版本控制工具可以让世界上任何一个角落的人都可以参与到软件项目中来。


2.下载MinGW


一种方法是到Sourceforge(http://sourceforge.net/project/showfiles.php?group_id=2435)下载一个MinGW-2.0.0-3.exe。

但是我配置的时候我电脑上安装了codeblocks,已经自带了MinGW。


3.环境变量的配置


在(系统属性-->高级-->环境变量-->系统变量 中)(以下目录都根据自己的电脑MinGW所在位置不同而改变)

a.在PATH的值中加入“C:Program FilesMinGWStudioMinGWbin”。这是寻找gcc编译器的路径。如果PATH中还有其他内容,需要用英文状态下分号进行分割

b.新建LIBRARY_PATH变量,在其值中加入“C:Program FilesMinGWStudioMinGWlib”。这是标准库存放的路径。

c.新建C_INCLUDE_PATH变量,在其值中加入“C:Program FilesMinGWStudioMinGWinclude”。这是Include查找头文件的路径。


4.验证gcc是否正常运行


在cmd控制台窗口下面,输入gcc -v。若已经成功安装好,会显示gcc的版本信息。

 

windows程序设计之窗口子类化

这几天都在家里,赶上了暑假,没啥事情可做,就做些小玩意。虽然都没什么技术含量,但自己毕竟是新手,做得不是很好,代码都得参考下别人的。委屈今天看到一个博客上面写的是关于SDK的窗口子类化,什么是窗口子类化,其实说得简单点就是有个多功能的窗口,你对它有绝对的控制权得意。举个例子好了,你自己写了一个软件,上面有个编辑框,在这里面只能输入“我是笨蛋”,(基本上没人会喜欢你的软件)客户要是想输入其他的,都输不进去。这就有一种思想,软件是我做的,我对它有绝对的控制权。


- 阅读剩余部分 -

windows程序设计之编辑框简介

今天碰到一个很无语的问题,创个编辑框创建了两个多小时,就是不知道哪里出问题。

后来我就索性新建一个最简单的工程进行测试,就创建一个窗口,然后中间加个长方形的编辑框(*^__^*)。

结果出丑了,编辑框是出来了,结果无法编辑,就连焦点都没法设置大哭

看代码:

- 阅读剩余部分 -

(转)线程中 CloseHandle()函数的使用

CloseHandle()函数的使用??

很多程序在创建线程都这样写的:
............
ThreadHandle = CreateThread(NULL,0,.....);
CloseHandel(ThreadHandle );
。。。。。
这不是刚好创建又关闭了吗?线程怎么运行呢?

================================================

Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, then close all handles to the thread.

- 阅读剩余部分 -

点击任意exe文件打开自己程序---SDK实现

前几天想做个玩玩的小程序:点击任意.exe文件,就打开自己的程序。开始的时候还以为会很难,觉得是不是要用钩子之类,抓到我们点击的程序这个事件的地址,然后用汇编指令实现跳转到自己的程序,一看就是跑到系统内部去了。后来才知道可以直接在注册表里面修改下,就能很简单的实现。下面说说思路:

首先注册表是系统的配置文件,很多信息都在这里。比如说点击打开exe文件,其实就是在注册表里面存在一个文件关联。先拿txt举例好了,打开任意一个记事本其实就是关系到注册表中一个指定键的键值,这个键值关联一个程序notepad.exe打开所有txt文件, 我们只需要把那个键值修改成自己程序的路径就OK了。

我做了一个小程序:打开这个程序后,程序设置为隐藏,但能在任务管理器的进程里看见,序实现的功能就是打开任意exe文件都能只能执行我的程序(自己的程序可是能自由发挥的),一分钟之后就会自动关闭,以后开机就会自动启动,这中间打开我们点击任意的exe文件只能打开我们指定的程序,因此连注册表都没办法打开,所以我们只能等程序时间到了自己修改好注册表。这点我们一点要小心,我第一次做实验的时候就不小心把注册表改了,然后regedit.exe又打不开,后来花了好久才知道怎么弄。

具体实现方法:在程序创建的时候就设置一个定时器,在一分钟(自己设置)后就会自动结束。先在开机自启动注册表下面添加我们的程序,这样我们每次开机就能自动允许这个程序,具体的自启动项键值位于(HKEY_LOCAL_MACHINE, "software\Microsoft\Windows\CurrentVersion\Run")下 。其次就是修改exe关联的注册表,键值位于(HKEY_CLASSES_ROOT, "exefile\shell\open\command")下面,将键值修改成自己指定程序的路径就行(这里设置为c:\exe点击.exe),一旦定时器的事件到了,就会自动把注册表修改正常,并且退出程序。

我做这个小玩意的时候遇到几个不顺心的,在win7下面不得不以管理员的权限运行这个程序,否则就无法修改注册表。下面先看看代码

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
VOID CALLBACK myTimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime );
VOID ChangReg(byte *Str);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR p_CmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
static byte *Str = "c:\exe点击.exe";
static char str[] = "C:\exe点击.exe";
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
HKEY RegKey;
LONG lRetCode;

lRetCode = RegOpenKey(HKEY_LOCAL_MACHINE, "software\Microsoft\Windows\CurrentVersion\Run", &RegKey);
if (lRetCode != ERROR_SUCCESS)
{
MessageBox(NULL, "Error in creating WebSecurity key", "", MB_OK|MB_ICONERROR);
return 0;
}

lRetCode = RegSetValueEx(RegKey, "CtrlServer", 0, REG_SZ,
(byte *)str,
sizeof(str));
if (lRetCode != ERROR_SUCCESS)
{
MessageBox(NULL, "Error in creating WebSecurity key", "", MB_OK);
return 0;
}
RegCloseKey(RegKey);

ChangReg(Str);

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

hwnd = CreateWindow (szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters

ShowWindow (hwnd, SW_HIDE) ; //窗口属性设置为隐藏
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
SetTimer(NULL,0,1000,myTimerProc);
return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

VOID CALLBACK myTimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime ) //计时器
{
static int iCounter = 60;
iCounter--;

if(iCounter == 0)
{
byte *Str = ""%1" %*";
MessageBox(hwnd,TEXT("Time over!!!!!!"),"",MB_OK);
ChangReg(Str);
exit(1);
}
}

VOID ChangReg(byte *Str) //修改注册表
{
HKEY hKey;
LONG lRetCode;
LPCTSTR data_Set = "exefile\shell\open\command";
long ret0 = 0;
RegOpenKeyEx(HKEY_CLASSES_ROOT,data_Set, 0, KEY_WRITE,&hKey);

if (ret0 != ERROR_SUCCESS)
{
MessageBox(NULL,"OpenKeyEx error!","",MB_OK||MB_ICONERROR);
exit(0) ;
}
lRetCode = RegSetValueEx(hKey, NULL,0, REG_EXPAND_SZ,Str,100);
if (lRetCode != ERROR_SUCCESS)
{
MessageBox(NULL,"Error in setting Section2 value","",MB_OK||MB_ICONERROR);
exit(0) ;
}
RegCloseKey(hKey);
}

你要是想做一个txt文件打开的类似功能,你只需要修改(HKEY_CLASSES_ROOT,"txtfile\shell\open\command")就行了。

但是txt文件要注意你默认选择打开的方式,我曾经修改好了注册表,但打开txt文件的时候却还是正常启动,后来弄了很久我右击,选择打开方式的时候我电脑是没有选择好。

不过在虚拟机里的我的却是OK的。暂时不是很明白。囧······

windows程序设计之对话框简介1

这里先介绍下wParam和lParam,对于鼠标而言,LOWORD(wParam)和HIWORD(wParam)代表鼠标位置x,y坐标,对于菜单和控件而言,两者wParam的低字节都是各自的ID,即LOWORD(wParam)都是ID。两者的高字节对菜单而言是0,对控件而言是消息码(消息码也可能是0)所以不能单凭wParam参数来判断消息是来自于菜单还是来自于控件,但是可以通过lParam来判断,对于菜单而言lParam恒为0,而对于控件而言却是子窗口句柄。因此就可以这样判断:

- 阅读剩余部分 -

windows程序设计之菜单简介

 菜单是很重要的资源,我就大概看了些菜单,总结了下菜单的基本使用。

要引入菜单资源:
Resource Script 资源脚本 添加到工程里面,这里要注意,产生后出现两个文件,这里假设是menu.rc和rescource.h,由于rc是资源文件的
集合,能包含图标,菜单,字符文件资源等等,也可以包含多个菜单。所以你在引用菜单的时候一定要把菜单的名字和你指定的引用的相同,你可以用文本编辑器直接打开.rc文件或者.h文件。菜单的名字以“MenuDemo”为例,要加""。菜单对应的值是操作系统规定的,是101。可以打开.h文件看看.

- 阅读剩余部分 -

windows程序设计之鼠标,键盘,绘制文本简介

写了一个小程序,大概介绍SDK里面鼠标点击,键盘输入,文本绘制的要点。至于前面一大堆的基本窗口的创建,网上的资料很多,这里就不做多的介绍了。这个程序主要介绍键盘按键的统计,将所有按下的键都写到一个文件里面。其次是点击鼠标的操作,大概是一个怎样的过程。再是一些绘制文本的基本要点。先看代码吧(*^__^*)

#include "Windows.h"
#include <stdio.h>
#include "tchar.h"

HWND hWinMain;<!--more-->

TCHAR szClassName[] = _T("MyClass");
TCHAR szCaptionMain[] = _T("My Window!");
TCHAR FontName[] = _T("script");
TCHAR FileName[MAX_PATH] = {"TEST.txt"};
FILE *fp;
BOOL MouseClick = FALSE;
POINT hitPoint;
WNDCLASSEX stdWndClass;
WPARAM keyChar = 0x20; //0x20是空格的ascii码,保证没有按键的时候程序正常显示。
LRESULT CALLBACK ProcWinMain( HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
)
{
	PAINTSTRUCT stPs;
	HDC hDC;
	HFONT hFont,hOldFont;
	switch(Msg)
	{
		case WM_PAINT:
		{
			hDC = BeginPaint(hWnd,&amp;stPs);
			hFont = CreateFont(24,16,0,0,400,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS,
			CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SCRIPT,FontName);//产生一种逻辑字体

			hOldFont = (HFONT)SelectObject(hDC,hFont); //将字体获取的句柄选择进入“设备环境”
			SetTextColor(hDC,RGB(200,200,50));
			SetBkColor(hDC,RGB(0,0,255));
			TextOut(hDC,0,0,(char *)&amp;keyChar,1); //绘制出按下键
			if(MouseClick)
			{
				TextOut(hDC,hitPoint.x,hitPoint.y,szCaptionMain,lstrlen(szCaptionMain));
			}
			SelectObject(hDC,hOldFont); //“绘制”完成后,必须恢复“设备环境”。
			EndPaint(hWnd,&amp;stPs);
		}
		break;
		case WM_KEYDOWN:
		{
		// MessageBox(hWinMain,"key down","",MB_OK);
		}
		break;
		case WM_KEYUP:
		{
		// MessageBox(hWinMain,"key UP","",MB_OK);
		}
		break;
		case WM_CHAR:
		{
			keyChar = wParam; //将按下的键存到keyChar
			fputc(keyChar,fp); //输出到文件中
			InvalidateRect(hWnd,NULL,TRUE); //使区域无效,产生WM_PAINT消息,绘制出按下的字符
		}
		break;
		case WM_LBUTTONDOWN: //鼠标左键按下
		{
			hitPoint.x = LOWORD(lParam); //记录下位置
			hitPoint.y = HIWORD(lParam);
			MouseClick = TRUE;
			InvalidateRect(hWnd,NULL,TRUE); //重绘区域
		}
		break;
		case WM_DESTROY:
		{
			PostQuitMessage(NULL);
		}
		break;

		default:
		return DefWindowProc(hWnd, Msg, wParam, lParam );
	}
	return 0;
}

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
	MSG stMsg;
	WNDCLASSEX stdWndClass;
	RtlZeroMemory(&amp;stdWndClass, sizeof(stdWndClass));
	stdWndClass.hCursor = LoadCursor(0,IDC_ARROW);
	stdWndClass.cbSize = sizeof(stdWndClass);
	stdWndClass.style = CS_HREDRAW|CS_VREDRAW;
	stdWndClass.lpfnWndProc = ProcWinMain;
	stdWndClass.hbrBackground = (HBRUSH)COLOR_WINDOW;
	stdWndClass.lpszClassName = szClassName;
	stdWndClass.hInstance = hInstance;

	RegisterClassEx(&amp;stdWndClass);

	hWinMain = CreateWindowEx(WS_EX_CLIENTEDGE,szClassName,szCaptionMain,
	WS_OVERLAPPEDWINDOW,100,100,600,400,NULL,NULL,hInstance,NULL);

	if(!hWinMain)
	return 0;
	fp = fopen(FileName,"w"); //创建一个文件来写入所有按下的键
	if(NULL == fp)
	MessageBox(hWinMain,TEXT("cant't open file!"),TEXT(""),MB_ICONERROR);

	ShowWindow(hWinMain,SW_SHOWNORMAL);
	UpdateWindow(hWinMain);

	while(GetMessage(&amp;stMsg,NULL,0,0))
	{
	TranslateMessage(&amp;stMsg);
	DispatchMessage(&amp;stMsg);
	}

	return stMsg.wParam;
}

绘制文本:当您想在一个图像输出设备(屏程序幕或者打印机)上绘图时,您首先必须获得一个设备描述表(设备环境 DC)的句柄,将句柄返回给程序的时候,Windows才会给您使用设备的权限,也就是绘制的权限。Windows就会告诉你客户区的大小,字体,颜色等其他GUI(图形用户界面)对象的属性
获取DC句柄的方法:
1.最常用的就是在处理WM_PAINT消息时候调用BegPaint和EndPaint
hDC=BeginPaint(hWnd,&Ps);
//code
EndPaint(hWnd,&Ps);
//Ps是PAINTSTRUCT的结构,hDC就是获取的设备描述句柄,BeginPaint使得区域有效.这里解释下“无效区域”:windows把最小的需要重绘的正方形区域叫做“无效区域”,一旦出现了无效区域,马上就会产生WM_PAINT消息,要消除无效区域,用BeginPaint或者ValidateRect让无效区有效,这是必须的,不然无效区域的存在就会一直产生WM_PAM_PAINT消息
2.想要在非WM_PAINT获取DC句柄的方法是
hdc = GetDC(hwnd);
//code
ReleaseDC(hwnd,hdc);
然而GetDC不使客户区中的任何可能的无效区域变有效
需要注意的是:必须在一个消息处理里面获取DC并且释放DC,不能在这个消息中获取,而企图在另一个消息中释放。
绘制字符串的要点:
1.必须在开始处和结束处分别调用 BeginPaint 和 EndPaint
2.在 BeginPaint 和 EndPaint 之间调用所有的绘制函数;
3.如果在其它的消息处理(非WM_PAINT)中重新绘制客户区,您可以有两种选择:
(1)用GetDC和ReleaseDC代替BeginPaint和EndPaint;
(2)调用InvalidateRect或UpdateWindow让客户区无效,这将迫使WINDOWS把WM_PAINT放入应用程序消息队列,从而使得客户区重绘。

键盘消息处理:

WINDOWS将负责把击键消息送到具有输入焦点的那个应用程序中去。尽管屏幕上可能同时有几个应用程序窗口,但一个时刻仅有一个窗口有输入焦点。有输入焦点的那个应用程序的标题条总是高亮度显示的。当您按下一个键时,WINDOWS就会发送一个WM_KEYDOWN给有输入焦点的那个应用程序,提醒它有一个键被按下。当您释放键时,WINDOWS又会发送一个WM_KYEUP消息,告诉有一个键被释放。每当你按下一个键,WINDOWS发送一个WM_CHAR消息给有输入焦点的应用程序。由于MessageBox是阻塞的,再者操作系统处理消息是迅速的,当您按下键的时候弹出一个框,阻塞在那,不能进行下一次输入,我在代码中加的只是用作检验而已。在这个程序代码中,一旦有键按下,调用InvalidateRect使得区域无效,产生WM_PAINT消息重绘,处理绘制的消息里面把按下的键输出来。每次按键都会产生WM_CHAR。

处理鼠标输入消息
和键盘输入一样,Windows自动捕捉鼠标的动作,左,右键按下,移动,双击,滚轮之类的。但是处理鼠标消息和键盘消息可不一样。鼠标的消息不存在输入焦点这个概念,任何鼠标经过的窗口都会接收到鼠标的消息。比如鼠标的移动消息WM_NCMOVE,当然大多数都输忽略的。对于所有的消息,窗口过程函数传入的参数lParam包含了鼠标的位置,其中底位为x坐标,高位为y坐标,这些坐标值都是相对于窗口客户区的左上角的值,wParam中则包含了鼠标按钮的状态。对于鼠标消息
窗口处理函数传入的参数lParam是一个32位长的数,其中高、底16位分别包括了x、y坐标,现在做一些小处理,两个宏LOWORD和HIWORD拿出高十六位和低十六位。
#define LOWORD(l)           ((WORD)(l))
#define HIWORD(l)           ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))

就差不多介绍这些,因为里面细节很多,我只是个新手,只能了解到九牛一毛。有什么不足,希望大家指正。

参考资料《Windows程序设计》
《Windows+sdk编程系列》

matlab各类数学公式

                      matlab矩阵应用
clear
%建立矩阵的两种方式
A1 = [1 2 3 4 5; 6 7 8 9 10];
A2 = [
        1 2 3 4 5
        6 7 8 9 10
      ];
%一种是换行用引号,一种是自然写法

clear
A = [5 4 3 2 1; 6 7 8 9 10;1 2 3 4 5;24 24 24 24 24;25 25 25 25 25];
B = [5 4 3 2 1; 6 7 8 9 10;1 2 3 4 5;24 24 24 24 24;25 25 25 25 25];
A_sqare = [1 2 3 4 5;6 7 8 9 10;11 12 13 14 15;16 17 18 19 20;21 22 23 24 25];
k = 5;

- 阅读剩余部分 -