64位操作系统安装 MySQL-python-1.2.3.win 失败,提示 fatal error C1083: Cannot open include file: 'config-win.h',网上方案均不可行,实际上只需要直接下载 MySQL-python-1.2.3.win-amd64-py2.7.exe 安装即可。下载地址请自行搜索。
1、增加windows环境变量以下路径
D:\Python26;D:\Python26\Tools\Scripts;D:\Program Files\Sublime Text 2
2、注销并重新登录,使用命令行敲入python可显示出python的版本信息
3、使用ctrl+b 如果仍然未出现编译信息,要查看ctrl+· 是否有错误信息,将错误的插件remove掉
一直以来都说ogre渲染效率很高,最近想研究一下3d,就下来ogre的代码,看看有没有可能改改就能做游戏,没想到试了一个例子就被打击了,SkeletalAnimation 中将#define NUM_JAIQUAS 50 设为渲染50 个角色模型,渲染就只剩下4帧了。
我的机器配置还是不错的3.0的双核intel 2G的内存 GF7600 gs 的显卡。mmorpg中同屏100人以上是很平常的事情,4帧可真的是没法玩。
1、父子二人经过五星级饭店门口,看到一辆十分豪华的进口轿车。儿子不屑地对他的父亲说:「坐这种车的人,肚子里一定没有学问!」父亲则轻描淡写地回答:「说这种话的人,口袋里一定没有钱!」
(你对事情的看法,是不是也反映出你内心真正的态度?)
2、晚饭后,母亲和女儿一块儿洗碗盘,父亲和儿子在客厅看电视。突然,厨房里传来打破盘子的响声,然后一片沉寂。是儿子望着他父亲,说道:「一定是妈妈打破的。」「你怎么知道?」「她没有骂人。」
(我们习惯以不同的标准来看人看己,以致往往是责人以严,待己以宽。)
3、有两个台湾观光团到日本伊豆半岛旅游,路况很坏,到处都是坑洞。其中一位导游连声抱歉,说路面简直像麻子一样。而另一个导游却诗意盎然地对游客说:诸位先生女士,我们现在走的这条道路,正是赫赫有名的伊豆迷人酒窝大道。」
(虽是同样的情况,然而不同的意念,就会产生不同的态度。思想是何等奇妙的事,如何去想,决定权在你。)
4、同样是小学三年级的学生,在作文中说他们将来的志愿是当小丑。中国的老师斥之为:「胸无大志,孺子不可教也!」外国的老师则会说:「愿你把欢笑带给全世界!」
(身为长辈的我们,不但容易要求多于鼓励,更狭窄的界定了成功的定义。)
5、在故宫博物院中,有一个太太不耐烦地对她先生说:「我说你为甚么走得这么慢。原来你老是停下来看这些东西。」
(有人只知道在人生的道路上狂奔,结果失去了观看两旁美丽花朵的机会。)
6、妻子正在厨房炒菜。丈夫在她旁边一直唠叨不停:慢些。小心!火太大了。赶快把鱼翻过来。快铲起来,油放太多了!把豆腐整平一下!「哎厎」妻子脱口而出,「我懂得怎样炒菜。」「你当然懂,太太,」丈夫平静地答道:「我只是要让你知道,我在开车时,你在旁边喋喋不休,我的感觉如何。」
(学会体谅他人并不困难,只要你愿意认真地站在对方的角度和立场看问题。)
7、理由充份:一辆载满乘客的公共汽车沿着下坡路快速前进着,有一个人後面紧紧地追赶着这辆车子。一个乘客从车窗中伸出头来对追车子的人说:“老兄!算啦,你追不上的!”“我必须追上它,”这人气喘吁吁地说:“我是这辆车的司机!”
(有些人必须非常认真努力,因为不这样的话,後果就十分悲惨了!然而也正因为必须全力以赴,潜在的本能和不为人知的特质终将充份展现出来。)
8、原来如此-甲:「新搬来的邻居好可恶,昨天晚上三更半夜、夜深人静之时跑来猛按我家的门铃。」乙:「的确可恶!你有没有马上报警?」甲:「没有。我当他们是疯子,继续吹我的小喇叭。」
(事出必有因,如果能先看到自己的不是,答案就会不一样在你面对冲突和争执时,先想一想是否心中有亏,或许很快就能释怀了。)
9、误会-某日,张三在山间小路开车,正当他悠哉地欣赏美丽风景时,突然迎面开来一辆货车,而且满囗黑牙的司机还摇下窗户对他大骂一声:“猪!”张三越想越纳闷,也越想越气,於是他也摇下车窗回头大骂:“你才是猪!”才刚骂完,他便迎头撞上一群过马路的猪。
(不要错误的诠释别人的好意,那只会让自己吃亏,并且使别人受辱。在不明所以之前,先学会按捺情绪,耐心观察,以免事後生发悔意。)
10、後生可畏-小男孩问爸爸:“是不是做父亲的总比做儿子的知道得多?”爸爸回答:“当然啦!”小男孩问:“电灯是谁发明的?”爸爸:“是爱迪生。”小男孩又问:“那爱迪生的爸爸怎麽没有发明电灯?”
(很奇怪,喜欢倚老卖老的人,特别容易栽跟斗。权威往往只是一个经不起考验的空壳子,尤其在现今这个多元开放的时代。)
11、不必紧张-小明洗澡时不小心吞下一小块肥皂,他的妈妈慌慌张张地打电话向家庭医生求助。医生说:“我现在还有几个病人在,可能要半小时後才能赶过去。”小明妈妈说:“在你来之前,我该做甚麽?”医生说:“给小明喝一杯白开水,然後用力跳一跳,你就可以让小明用嘴巴吹泡泡消磨时间了。”
(take it easy,放轻松放轻松些,生活何必太紧张?事情既然已经发生了,何不坦然自在的面对。担心不如宽心,穷紧张不如穷开心。)
12、钥匙-一把坚实的大锁挂在大门上,一根铁杆费了九牛二虎之力,还是无法将它撬开。钥匙来了,他瘦小的身子钻进锁孔,只轻轻一转,大锁就“啪”地一声打开了。铁杆奇怪地问:“为什麽我费了那麽大力气也打不开,而你却轻而易举地就把它打开了呢?”钥匙说:“因为我最了解他的心。”
(每个人的心,都像上了锁的大门,任你再粗的铁棒也撬不开。唯有关怀,才能把自己变成一只细腻的钥匙,进入别人的心中,了解别人。)
摘要: 利用匿名管道在父子进程间传递数据
进程间传递数据有很多种方法,常用到的有命令行、共享内存、内存映射文件、剪贴板、windows消息、socket等。
命令行的缺点是数据长度限制。Windows2000只能传递256个字节,内存映射文件、共享内存都需要一些进程同步才能很好的配合读写数据,剪贴板可能会被其他进程擦数数据。当多开的时候很难控制进程间的对应关系。
一种解决方案是生成随机命名的同步...
阅读全文
用DX自绘Edit控件往往没有真是的EDIT窗口存在,所以输入法窗口无法跟随,这里给出一个解决方案
计算当前光标的位置
用API ImmSetCompositionWindow指定IME 窗口到当前光标位置
在WM_KEYDOWN消息中处理
以下是代码:
------------------------------------------------------------------------------------------------
int nSelStart = 0, nSelEnd = 0;
this->GetSel( nSelStart, nSelEnd );
CPoint pntCursor = this->PosFromChar( nSelEnd );
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
if ( pntCursor.x == -1)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
nSelEnd -=1;
if ( nSelEnd < 0 )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
nSelEnd = 0;
}
pntCursor = this->PosFromChar( nSelEnd );
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
HIMC hImc = ImmGetContext(m_hWnd);
COMPOSITIONFORM form;
form.dwStyle = CFS_RECT;
form.ptCurrentPos = CPoint(pntCursor.x,0);
form.rcArea = CRect(pntCursor.x,0,pntCursor.x+300,100);
ImmSetCompositionWindow(hImc,&form);
Dump
调用堆栈的原理以及异常信息的反馈
动机:
在游戏开发过程中,我们利用
QA
部门来做产品的质量保证,尽可能将绝大部分错误消化在内部,保证游戏的版本质量,但是
QA
部门毕竟有他的局限性,尽管经过严格的测试也很难保证将所有的问题一网打尽.
通过在
Log
中转储的错误信息,我们可以进一步找出问题,但是
Log
文件产生在终端,我们拿到的也仅仅是公司内部测试部门产生的
Log
文件,显然公司内部得到的信息是很有限的,如果能从玩家那里拿到异常信息,我们才能最快的去解决问题,尽可能在错误产生重大影响之前将其解决,所以我们有必要从被动的获取异常信息,转为主动去获取.
可行性
:
在错误发生时
Dump
调用堆栈,可以让我们知道错误发生的位置,这比已往普通的
LOG
更加有效的多.我们可以将出错的堆栈地址反馈回来.这一切在终端出现异常的时候自动进行.
Windows
操作系统提供的
SEH
结构化异常机制可能让我们在程序崩溃的瞬间处理这些事情.
效率问题
:
SEH
是
windows
的异常机制,除非在编译时候特别指定不使用,否则总有默认的
SEH
处理机制,
kernel32.dll
中有默认的
SEH
处理接口,当我们需要自己处理异常的时候,我们的处理点会挂接在异常处理链的最前端,这种链类似
Hook
的链.链的头部放在
fs[0]
的位置.也就是说效率的问题是可以不必考虑,
具体实现
:
通过阅读反汇编代码可以了解函数调用过程中堆栈的结构
:
1
函数调用时
CALL
将下一行指令地址压入堆栈
2
函数运行第一行会将
EBP
压入堆栈
3
保存当前堆栈地址到
EBP (mov ebp,esp)
再遇到
call
时从第一步执行,所以每次第二步压入堆栈的都是上一层函数调用的
ESP
地址,而这个地址
+4
字节偏移则是当前调用函数返回后的下一条指令,也就是上一层函数的地址,所以我们只要知道当前函数的
EBP
值
(
也就是当前函数的栈顶
)
就能够遍历得到所有调用堆栈层次.
![dumpebp.jpg](/images/cppblog_com/returnnull/dumpebp.jpg)
我们将windows SEH 结构化异常引入后,可以在异常发生的时候得到当前的EBP值,从而通过这个值得到整个调用堆栈的地址.
在发布工程的时候,我们只需要生成map文件,就可以通过这个地址得到崩溃位置.使用HTTP GET 或POST方式可以将我们所需要的崩溃信息提交到我们指定的网站.这种方式只是通过URL参数来提交数据,只需要使用API InternetOpenUrl就可以很方便的将信息提交.此外如果不使用HTTP方式,我们也可以在这个时候创建新的socket 对指定的服务器进行连接来传输数据.
static TCHAR hdrs[] = _T("Content-Type: application/x-www-form-urlencoded");
static const TCHAR* accept= _T("Accept: */*");
static TCHAR action[]=_T("datecomit.aspx");//预提交的页面
static TCHAR server[]=_T("192.168.9.119");//提交的server地址
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
static TCHAR frmdata[1024] ={0};
_tcscpy(frmdata,_T("message=this is a test message");
//提交数据, message为提交名字
// for clarity, error-checking has been removed
HINTERNET hSession = InternetOpen("MyAgent",
INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hSession, server,
INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", action, NULL, NULL, &accept, 0, 1);
HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));
此后我们只需要定期观察所提交的内容,便可以立即得知是否有异常出现.根据同一异常出现的几率可以得知是否是致命的错误,是否需要紧急更新.
成员函数的调用是编译器内部使用的 __thiscall 即需要this指针,
所以我们调用成员函数必须满足的条件是
1 需要this指针,
2 成员函数有固定的函数地址
先看条件 1
this指针是在函数调用前用ECX寄存器传入的,
所以我们只需要提前讲this指针赋值给ECX即可
条件2
成员函数是有固定的地址的,也就是说我们可以直接调用,不过大多数情况下因为要访问成员变量,所以如果没有this指针,会在访问时产生异常.对于不需要this指针的成员函数可以正常调用.
如类 CTest
class CTest
{
public
:
![](/Images/OutliningIndicators/None.gif)
CTest() : m_nData (
5
){}
![](/Images/OutliningIndicators/None.gif)
int
GetNum(){reutrn
3
;]
![](/Images/OutliningIndicators/None.gif)
int
GetAmount(){return
2
+
m_nData;}
private
:
int
m_nData;
};
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
//
可以这样调用GetNum
return ((CTest
*
)
0
)
->
GetNum();
![](/Images/OutliningIndicators/None.gif)
这两个条件都可以满足,所以代码如下:
typedef int (CTest::*GETAMOUNT)();
![](/Images/OutliningIndicators/None.gif)
void Process(CTest& t , GETAMOUNT GetAmont)
{
int nResult =0;
__asm{
mov ecx,[t] ;传入this指针
call GetAmont ;调用成员函数
mov nResult, eax ;返回值在EAX中
}
cout<<nResult<<endl;
}
![](/Images/OutliningIndicators/None.gif)
int main(int argc, char* argv[])
{
CTest test;
![](/Images/OutliningIndicators/None.gif)
Process(test, &CTest::GetAmount);
return 0;
}
![](/Images/OutliningIndicators/None.gif)
IRQ全称为Interrupt Request,即是“中断请求”的意思(以下使用IRQ称呼)。IRQ的作用就是在我们所用的电脑中,执行硬件中断请求的动作,用来停止其相关硬件的工作状态,比如我们在打印一份图片,在打印结束时就需要由系统对打印机提出相应的中断请求,来以此结束这个打印的操作。在每台电脑的系统中,是由一个中断控制器8259或是8259A的芯片(现在此芯片大都集成到其它的芯片内)来控制系统中每个硬件的中断控制。目前共有16组IRQ,去掉其中用来作桥接的一组IRQ,实际上只有15组IRQ可供硬件调用。这16组IRQ的主要用途如下表:
IRQ编号
设备名称
用途
IRQ0
Time
电脑系统计时器
IRQ1
KeyBoard
键盘
IRQ2
Redirect IRQ9
与IRQ9相接,MPU-401 MDI使用该IRQ
IRQ3
COM2
串口设备
IRQ4
COM1
串口设备
IRQ5
LPT2
建议声卡使用该IRQ
IRQ6
FDD
软驱传输控制用
IRQ7
LPT1
打印机传输控制用
IRQ8
CMOS Alert
即时时钟
IRQ9
Redirect IRQ2
与IRQ2相接;可设定给其它硬件使用
IRQ10
Reversed
建议保留给网卡使用该IRQ
IRQ11
Reversed
建议保留给AGP显卡使用
IRQ12
PS/2Mouse
接PS/2鼠标,若无也可设定给其他硬件使用
IRQ13
FPU
协处理器用,例如FPU(浮点运算器)
IRQ14
Primary IDE
主硬盘传输控制用
IRQ15
Secondary Ide
从硬盘传输控制用
Windbg调试Release版exe .dll .ocx 等 (转)
v0.1 2006-6-1(儿童节)
1.生成符号信息
更改Relase版的设置(2处):
一、Project Setting ->C/C++
Debug info:
选择Program Database
二、Project Setting ->Link
选中Generate debug info
重新编译
2.安装Windbg
下载安装最新的Windbg
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
3.设定环境变量
对于user32.dll等系统文件,Windbg可以自动从微软网站下载所需的符号信息.我们只需设定_NT_SYMBOL_PATH
这个环境变量告诉Winddbg.方法如下:
我的电脑>右键菜单>属性>高级选项卡>环境变量>系统变量>新建
变量名: _NT_SYMBOL_PATH
变量值:SRV*F:\websymbols*
http://msdl.microsoft.com/download/symbols
解释一下: F:\websymbols用来存储系统符号.你可以指定其他的路径.Windbg会自动创建该文件夹
4.设定符号路径
新建一个文件夹,譬如C:\MyAppSymbols
将第一步中生成的Release目录下<youapp>.pdb文件拷贝到该文件夹,该pdb文件包含了调试所需的符号信息.
打开Windbg,选择File>Symbol file path>将C:\MyAppSymbols路径添加进去
5.调试程序
选择 File > Open Executable 然后选择你需要调试的Exe文件,就可以调试了,其他操作和VC6差不多.