2017年11月3日
64位操作系統(tǒng)安裝 MySQL-python-1.2.3.win 失敗,提示 fatal error C1083: Cannot open include file: 'config-win.h',網(wǎng)上方案均不可行,實(shí)際上只需要直接下載 MySQL-python-1.2.3.win-amd64-py2.7.exe 安裝即可。下載地址請(qǐng)自行搜索。
2012年9月16日
1、增加windows環(huán)境變量以下路徑
D:\Python26;D:\Python26\Tools\Scripts;D:\Program Files\Sublime Text 2
2、注銷并重新登錄,使用命令行敲入python可顯示出python的版本信息
3、使用ctrl+b 如果仍然未出現(xiàn)編譯信息,要查看ctrl+· 是否有錯(cuò)誤信息,將錯(cuò)誤的插件remove掉
2007年7月28日
一直以來都說ogre渲染效率很高,最近想研究一下3d,就下來ogre的代碼,看看有沒有可能改改就能做游戲,沒想到試了一個(gè)例子就被打擊了,SkeletalAnimation 中將#define NUM_JAIQUAS 50 設(shè)為渲染50 個(gè)角色模型,渲染就只剩下4幀了。
我的機(jī)器配置還是不錯(cuò)的3.0的雙核intel 2G的內(nèi)存 GF7600 gs 的顯卡。mmorpg中同屏100人以上是很平常的事情,4幀可真的是沒法玩。
2007年7月25日
1、父子二人經(jīng)過五星級(jí)飯店門口,看到一輛十分豪華的進(jìn)口轎車。兒子不屑地對(duì)他的父親說:「坐這種車的人,肚子里一定沒有學(xué)問!」父親則輕描淡寫地回答:「說這種話的人,口袋里一定沒有錢!」
(你對(duì)事情的看法,是不是也反映出你內(nèi)心真正的態(tài)度?)
2、晚飯后,母親和女兒一塊兒洗碗盤,父親和兒子在客廳看電視。突然,廚房里傳來打破盤子的響聲,然后一片沉寂。是兒子望著他父親,說道:「一定是媽媽打破的。」「你怎么知道?」「她沒有罵人。」
(我們習(xí)慣以不同的標(biāo)準(zhǔn)來看人看己,以致往往是責(zé)人以嚴(yán),待己以寬。)
3、有兩個(gè)臺(tái)灣觀光團(tuán)到日本伊豆半島旅游,路況很壞,到處都是坑洞。其中一位導(dǎo)游連聲抱歉,說路面簡(jiǎn)直像麻子一樣。而另一個(gè)導(dǎo)游卻詩意盎然地對(duì)游客說:諸位先生女士,我們現(xiàn)在走的這條道路,正是赫赫有名的伊豆迷人酒窩大道。」
(雖是同樣的情況,然而不同的意念,就會(huì)產(chǎn)生不同的態(tài)度。思想是何等奇妙的事,如何去想,決定權(quán)在你。)
4、同樣是小學(xué)三年級(jí)的學(xué)生,在作文中說他們將來的志愿是當(dāng)小丑。中國的老師斥之為:「胸?zé)o大志,孺子不可教也!」外國的老師則會(huì)說:「愿你把歡笑帶給全世界!」
(身為長輩的我們,不但容易要求多于鼓勵(lì),更狹窄的界定了成功的定義。)
5、在故宮博物院中,有一個(gè)太太不耐煩地對(duì)她先生說:「我說你為甚么走得這么慢。原來你老是停下來看這些東西。」
(有人只知道在人生的道路上狂奔,結(jié)果失去了觀看兩旁美麗花朵的機(jī)會(huì)。)
6、妻子正在廚房炒菜。丈夫在她旁邊一直嘮叨不停:慢些。小心!火太大了。趕快把魚翻過來。快鏟起來,油放太多了!把豆腐整平一下!「哎厎」妻子脫口而出,「我懂得怎樣炒菜。」「你當(dāng)然懂,太太,」丈夫平靜地答道:「我只是要讓你知道,我在開車時(shí),你在旁邊喋喋不休,我的感覺如何。」
(學(xué)會(huì)體諒他人并不困難,只要你愿意認(rèn)真地站在對(duì)方的角度和立場(chǎng)看問題。)
7、理由充份:一輛載滿乘客的公共汽車沿著下坡路快速前進(jìn)著,有一個(gè)人後面緊緊地追趕著這輛車子。一個(gè)乘客從車窗中伸出頭來對(duì)追車子的人說:“老兄!算啦,你追不上的!”“我必須追上它,”這人氣喘吁吁地說:“我是這輛車的司機(jī)!”
(有些人必須非常認(rèn)真努力,因?yàn)椴贿@樣的話,後果就十分悲慘了!然而也正因?yàn)楸仨毴σ愿埃瑵撛诘谋灸芎筒粸槿酥奶刭|(zhì)終將充份展現(xiàn)出來。)
8、原來如此-甲:「新搬來的鄰居好可惡,昨天晚上三更半夜、夜深人靜之時(shí)跑來猛按我家的門鈴。」乙:「的確可惡!你有沒有馬上報(bào)警?」甲:「沒有。我當(dāng)他們是瘋子,繼續(xù)吹我的小喇叭。」
(事出必有因,如果能先看到自己的不是,答案就會(huì)不一樣在你面對(duì)沖突和爭(zhēng)執(zhí)時(shí),先想一想是否心中有虧,或許很快就能釋懷了。)
9、誤會(huì)-某日,張三在山間小路開車,正當(dāng)他悠哉地欣賞美麗風(fēng)景時(shí),突然迎面開來一輛貨車,而且滿囗黑牙的司機(jī)還搖下窗戶對(duì)他大罵一聲:“豬!”張三越想越納悶,也越想越氣,於是他也搖下車窗回頭大罵:“你才是豬!”才剛罵完,他便迎頭撞上一群過馬路的豬。
(不要錯(cuò)誤的詮釋別人的好意,那只會(huì)讓自己吃虧,并且使別人受辱。在不明所以之前,先學(xué)會(huì)按捺情緒,耐心觀察,以免事後生發(fā)悔意。)
10、後生可畏-小男孩問爸爸:“是不是做父親的總比做兒子的知道得多?”爸爸回答:“當(dāng)然啦!”小男孩問:“電燈是誰發(fā)明的?”爸爸:“是愛迪生。”小男孩又問:“那愛迪生的爸爸怎麼沒有發(fā)明電燈?”
(很奇怪,喜歡倚老賣老的人,特別容易栽跟斗。權(quán)威往往只是一個(gè)經(jīng)不起考驗(yàn)的空殼子,尤其在現(xiàn)今這個(gè)多元開放的時(shí)代。)
11、不必緊張-小明洗澡時(shí)不小心吞下一小塊肥皂,他的媽媽慌慌張張地打電話向家庭醫(yī)生求助。醫(yī)生說:“我現(xiàn)在還有幾個(gè)病人在,可能要半小時(shí)後才能趕過去。”小明媽媽說:“在你來之前,我該做甚麼?”醫(yī)生說:“給小明喝一杯白開水,然後用力跳一跳,你就可以讓小明用嘴巴吹泡泡消磨時(shí)間了。”
(take it easy,放輕松放輕松些,生活何必太緊張?事情既然已經(jīng)發(fā)生了,何不坦然自在的面對(duì)。擔(dān)心不如寬心,窮緊張不如窮開心。)
12、鑰匙-一把堅(jiān)實(shí)的大鎖掛在大門上,一根鐵桿費(fèi)了九牛二虎之力,還是無法將它撬開。鑰匙來了,他瘦小的身子鉆進(jìn)鎖孔,只輕輕一轉(zhuǎn),大鎖就“啪”地一聲打開了。鐵桿奇怪地問:“為什麼我費(fèi)了那麼大力氣也打不開,而你卻輕而易舉地就把它打開了呢?”鑰匙說:“因?yàn)槲易盍私馑男摹?#8221;
(每個(gè)人的心,都像上了鎖的大門,任你再粗的鐵棒也撬不開。唯有關(guān)懷,才能把自己變成一只細(xì)膩的鑰匙,進(jìn)入別人的心中,了解別人。)
2007年5月11日
摘要: 利用匿名管道在父子進(jìn)程間傳遞數(shù)據(jù)
進(jìn)程間傳遞數(shù)據(jù)有很多種方法,常用到的有命令行、共享內(nèi)存、內(nèi)存映射文件、剪貼板、windows消息、socket等。
命令行的缺點(diǎn)是數(shù)據(jù)長度限制。Windows2000只能傳遞256個(gè)字節(jié),內(nèi)存映射文件、共享內(nèi)存都需要一些進(jìn)程同步才能很好的配合讀寫數(shù)據(jù),剪貼板可能會(huì)被其他進(jìn)程擦數(shù)數(shù)據(jù)。當(dāng)多開的時(shí)候很難控制進(jìn)程間的對(duì)應(yīng)關(guān)系。
一種解決方案是生成隨機(jī)命名的同步...
閱讀全文
用DX自繪Edit控件往往沒有真是的EDIT窗口存在,所以輸入法窗口無法跟隨,這里給出一個(gè)解決方案
計(jì)算當(dāng)前光標(biāo)的位置
用API ImmSetCompositionWindow指定IME 窗口到當(dāng)前光標(biāo)位置
在WM_KEYDOWN消息中處理
以下是代碼:
------------------------------------------------------------------------------------------------
int nSelStart = 0, nSelEnd = 0;
this->GetSel( nSelStart, nSelEnd );
CPoint pntCursor = this->PosFromChar( nSelEnd );

if ( pntCursor.x == -1)


{
nSelEnd -=1;
if ( nSelEnd < 0 )


{
nSelEnd = 0;
}
pntCursor = this->PosFromChar( nSelEnd );
}

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);
2007年3月27日
Dump
調(diào)用堆棧的原理以及異常信息的反饋
動(dòng)機(jī):
在游戲開發(fā)過程中,我們利用
QA
部門來做產(chǎn)品的質(zhì)量保證,盡可能將絕大部分錯(cuò)誤消化在內(nèi)部,保證游戲的版本質(zhì)量,但是
QA
部門畢竟有他的局限性,盡管經(jīng)過嚴(yán)格的測(cè)試也很難保證將所有的問題一網(wǎng)打盡.
通過在
Log
中轉(zhuǎn)儲(chǔ)的錯(cuò)誤信息,我們可以進(jìn)一步找出問題,但是
Log
文件產(chǎn)生在終端,我們拿到的也僅僅是公司內(nèi)部測(cè)試部門產(chǎn)生的
Log
文件,顯然公司內(nèi)部得到的信息是很有限的,如果能從玩家那里拿到異常信息,我們才能最快的去解決問題,盡可能在錯(cuò)誤產(chǎn)生重大影響之前將其解決,所以我們有必要從被動(dòng)的獲取異常信息,轉(zhuǎn)為主動(dòng)去獲取.
可行性
:
在錯(cuò)誤發(fā)生時(shí)
Dump
調(diào)用堆棧,可以讓我們知道錯(cuò)誤發(fā)生的位置,這比已往普通的
LOG
更加有效的多.我們可以將出錯(cuò)的堆棧地址反饋回來.這一切在終端出現(xiàn)異常的時(shí)候自動(dòng)進(jìn)行.
Windows
操作系統(tǒng)提供的
SEH
結(jié)構(gòu)化異常機(jī)制可能讓我們?cè)诔绦虮罎⒌乃查g處理這些事情.
效率問題
:
SEH
是
windows
的異常機(jī)制,除非在編譯時(shí)候特別指定不使用,否則總有默認(rèn)的
SEH
處理機(jī)制,
kernel32.dll
中有默認(rèn)的
SEH
處理接口,當(dāng)我們需要自己處理異常的時(shí)候,我們的處理點(diǎn)會(huì)掛接在異常處理鏈的最前端,這種鏈類似
Hook
的鏈.鏈的頭部放在
fs[0]
的位置.也就是說效率的問題是可以不必考慮,
具體實(shí)現(xiàn)
:
通過閱讀反匯編代碼可以了解函數(shù)調(diào)用過程中堆棧的結(jié)構(gòu)
:
1
函數(shù)調(diào)用時(shí)
CALL
將下一行指令地址壓入堆棧
2
函數(shù)運(yùn)行第一行會(huì)將
EBP
壓入堆棧
3
保存當(dāng)前堆棧地址到
EBP (mov ebp,esp)
再遇到
call
時(shí)從第一步執(zhí)行,所以每次第二步壓入堆棧的都是上一層函數(shù)調(diào)用的
ESP
地址,而這個(gè)地址
+4
字節(jié)偏移則是當(dāng)前調(diào)用函數(shù)返回后的下一條指令,也就是上一層函數(shù)的地址,所以我們只要知道當(dāng)前函數(shù)的
EBP
值
(
也就是當(dāng)前函數(shù)的棧頂
)
就能夠遍歷得到所有調(diào)用堆棧層次.

我們將windows SEH 結(jié)構(gòu)化異常引入后,可以在異常發(fā)生的時(shí)候得到當(dāng)前的EBP值,從而通過這個(gè)值得到整個(gè)調(diào)用堆棧的地址.
在發(fā)布工程的時(shí)候,我們只需要生成map文件,就可以通過這個(gè)地址得到崩潰位置.使用HTTP GET 或POST方式可以將我們所需要的崩潰信息提交到我們指定的網(wǎng)站.這種方式只是通過URL參數(shù)來提交數(shù)據(jù),只需要使用API InternetOpenUrl就可以很方便的將信息提交.此外如果不使用HTTP方式,我們也可以在這個(gè)時(shí)候創(chuàng)建新的socket 對(duì)指定的服務(wù)器進(jìn)行連接來傳輸數(shù)據(jù).
static TCHAR hdrs[] = _T("Content-Type: application/x-www-form-urlencoded");
static const TCHAR* accept= _T("Accept: */*");
static TCHAR action[]=_T("datecomit.aspx");//預(yù)提交的頁面
static TCHAR server[]=_T("192.168.9.119");//提交的server地址


static TCHAR frmdata[1024] ={0};
_tcscpy(frmdata,_T("message=this is a test message");
//提交數(shù)據(jù), 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));
此后我們只需要定期觀察所提交的內(nèi)容,便可以立即得知是否有異常出現(xiàn).根據(jù)同一異常出現(xiàn)的幾率可以得知是否是致命的錯(cuò)誤,是否需要緊急更新.
2007年3月12日
成員函數(shù)的調(diào)用是編譯器內(nèi)部使用的 __thiscall 即需要this指針,
所以我們調(diào)用成員函數(shù)必須滿足的條件是
1 需要this指針,
2 成員函數(shù)有固定的函數(shù)地址
先看條件 1 ?
this指針是在函數(shù)調(diào)用前用ECX寄存器傳入的,
所以我們只需要提前講this指針賦值給ECX即可
條件2
成員函數(shù)是有固定的地址的,也就是說我們可以直接調(diào)用,不過大多數(shù)情況下因?yàn)橐L問成員變量,所以如果沒有this指針,會(huì)在訪問時(shí)產(chǎn)生異常.對(duì)于不需要this指針的成員函數(shù)可以正常調(diào)用.
如類 CTest
class?CTest
{
public
:

?CTest()?:?m_nData?(
5
){}

?
int
?GetNum(){reutrn?
3
;]

?
int
?GetAmount(){return?
2
?
+
?m_nData;}
private
:
?
int
?m_nData;
};


//
可以這樣調(diào)用GetNum
return?((CTest
*
)
0
)
->
GetNum();

這兩個(gè)條件都可以滿足,所以代碼如下:
typedef?int?(CTest::*GETAMOUNT)();

void?Process(CTest&?t?,?GETAMOUNT?GetAmont)
{
??int?nResult?=0;
??__asm{
?????mov?ecx,[t]??????;傳入this指針
?????call?GetAmont????;調(diào)用成員函數(shù)
?????mov?nResult,?eax?;返回值在EAX中
????????}
??cout<<nResult<<endl;
}

int?main(int?argc,?char*?argv[])
{
??CTest?test;

??Process(test,?&CTest::GetAmount);????
??return?0;
}????

2007年2月2日
IRQ全稱為Interrupt Request,即是“中斷請(qǐng)求”的意思(以下使用IRQ稱呼)。IRQ的作用就是在我們所用的電腦中,執(zhí)行硬件中斷請(qǐng)求的動(dòng)作,用來停止其相關(guān)硬件的工作狀態(tài),比如我們?cè)诖蛴∫环輬D片,在打印結(jié)束時(shí)就需要由系統(tǒng)對(duì)打印機(jī)提出相應(yīng)的中斷請(qǐng)求,來以此結(jié)束這個(gè)打印的操作。在每臺(tái)電腦的系統(tǒng)中,是由一個(gè)中斷控制器8259或是8259A的芯片(現(xiàn)在此芯片大都集成到其它的芯片內(nèi))來控制系統(tǒng)中每個(gè)硬件的中斷控制。目前共有16組IRQ,去掉其中用來作橋接的一組IRQ,實(shí)際上只有15組IRQ可供硬件調(diào)用。這16組IRQ的主要用途如下表:
IRQ編號(hào)
設(shè)備名稱
用途
IRQ0
Time
電腦系統(tǒng)計(jì)時(shí)器
IRQ1
KeyBoard
鍵盤
IRQ2
Redirect IRQ9
與IRQ9相接,MPU-401 MDI使用該IRQ
IRQ3
COM2
串口設(shè)備
IRQ4
COM1
串口設(shè)備
IRQ5
LPT2
建議聲卡使用該IRQ
IRQ6
FDD
軟驅(qū)傳輸控制用
IRQ7
LPT1
打印機(jī)傳輸控制用
IRQ8
CMOS Alert
即時(shí)時(shí)鐘
IRQ9
Redirect IRQ2
與IRQ2相接;可設(shè)定給其它硬件使用
IRQ10
Reversed
建議保留給網(wǎng)卡使用該IRQ
IRQ11
Reversed
建議保留給AGP顯卡使用
IRQ12
PS/2Mouse
接PS/2鼠標(biāo),若無也可設(shè)定給其他硬件使用
IRQ13
FPU
協(xié)處理器用,例如FPU(浮點(diǎn)運(yùn)算器)
IRQ14
Primary IDE
主硬盤傳輸控制用
IRQ15
Secondary Ide
從硬盤傳輸控制用
Windbg調(diào)試Release版exe .dll .ocx 等 (轉(zhuǎn))
v0.1 2006-6-1(兒童節(jié))
1.生成符號(hào)信息
更改Relase版的設(shè)置(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.設(shè)定環(huán)境變量
對(duì)于user32.dll等系統(tǒng)文件,Windbg可以自動(dòng)從微軟網(wǎng)站下載所需的符號(hào)信息.我們只需設(shè)定_NT_SYMBOL_PATH
這個(gè)環(huán)境變量告訴Winddbg.方法如下:
我的電腦>右鍵菜單>屬性>高級(jí)選項(xiàng)卡>環(huán)境變量>系統(tǒng)變量>新建
變量名: _NT_SYMBOL_PATH
? ? 變量值:SRV*F:\websymbols*
http://msdl.microsoft.com/download/symbols
解釋一下: F:\websymbols用來存儲(chǔ)系統(tǒng)符號(hào).你可以指定其他的路徑.Windbg會(huì)自動(dòng)創(chuàng)建該文件夾
4.設(shè)定符號(hào)路徑
新建一個(gè)文件夾,譬如C:\MyAppSymbols
將第一步中生成的Release目錄下<youapp>.pdb文件拷貝到該文件夾,該pdb文件包含了調(diào)試所需的符號(hào)信息.
打開Windbg,選擇File>Symbol file path>將C:\MyAppSymbols路徑添加進(jìn)去
5.調(diào)試程序
選擇 File > Open Executable 然后選擇你需要調(diào)試的Exe文件,就可以調(diào)試了,其他操作和VC6差不多.