跳到主要內容

發表文章

目前顯示的是 12月, 2006的文章

Python Quick Reference

下面的網址中有Richard Gruet整理過的Python快速參考文件,這對於一些正在學習Python的人來說是必備的桌上文件。Richard Gruet整理的非常詳細,版本從1.52一直到2.5版的Python都有。 http://rgruet.free.fr/#QuickRef

優雅的宇宙(Elegant Universe)的影片

今天上網查資料的時候,無意中看到 優雅的宇宙(Elegant Universe) 的影片。這個影片是依據Elegant Universe一書來拍攝的,主要的內容cover了弦論及大統一理論。對物理有興趣的人可以看看。影片分成許多小段,總共時間三小時。 http://www.pbs.org/wgbh/nova/elegant/program.html

該死的WTSRegisterSessionNotification()在Vista下面沒用了

最近才發現WTSRegisterSessionNotification()這個Function在Vista下面已經失去作用了。變成之前在XP下面可以在切換使用者後繼續工作的程式,現在沒有作用了!上網找了一下,發現新的替代方案要去寫Service程式。天阿!哪那麼多閒功夫阿。 還好,後來發現 WTSGetActiveConsoleSessionId ()這個function在Vista下面還有作用。因此,透過Timer的方式定期去呼叫這個函式確定Active console session是否不一樣了。一旦不一樣,就表示session被切換了。當切換回原來的session時,就會得到一樣的id。如此便知道已經回到原來的Session了。程式概念大概如下: DWORD MyId = -1; BOOLEAN SessionChanged; // 程式啟動時,先取得目前的session id並且記錄下來。 OnCreate() { MyId = WTSGetActiveConsoleSessionId(); SessionChanged = FALSE; } OnTimer() { if (SessionChanged) { if (MyId == WTSGetActiveConsoleSessionId()) { SessionChanged = FALSE; // Session已經重新回復到原來的session. // 在這裡進行必要的回復工作。 } } else { if (MyId != WTSGetActiveConsoleSessionId()) { SessionChanged = TRUE; // Session已經被改掉了,需要在這裡趕快進行必要的處理。 } } } 這其實並不是一個很好的作法,因為要透過一個Timer定期的去polling,Timer的週期太短容易造成系統的負擔,太長的話,可能會抓不到Session的變化。不過,經過一些實驗之後,發現大約2-4秒的週期去polling,還沒有什麼大的問題。

如何使用多個DDK的setenv在一個batch file

下面的範例簡單的展示了如何在一個batch file進行多個不同平台的DDK驅動程式製作。看起來是很簡單,但是也花了我一段時間,因為Microsoft的MSDN上面所給的 範例 是錯的,根本run不起來。 REM Filename is buildall.bat. set CWD=%cd% set BUILD_TYPE=%1% set DDKPATH=D:\winddk\5744 cmd /C "%DDKPATH%\bin\setenv.bat %DDKPATH% %BUILD_TYPE% WLH && cd /D %CWD% && build" cmd /C "%DDKPATH%\bin\setenv.bat %DDKPATH% %BUILD_TYPE% AMD64 WLH && cd /D %CWD% && build" 使用時,只需要在要編譯的source code目錄下,輸入如下的命令即可: > buildall.bat chk 或者 > buildall.bat fre 這樣一次可以建立32與64位元的Vista驅動程式版本。

包裝OutputDebugString成為printf style的介面

下面的程式將OutputDebugString包裝成printf介面,有需要的人可以自行copy回去使用,這對於輸出Debug資訊上有一定程度的幫助,另外對於看Debug message的工具,個人推薦使用 DbgView ,目前最新版本已經可以在Vista 32/64-bit平台下面使用。實在是一個非常方便的工具。 #ifdef DBG void __cdecl DbgPrint(LPCTSTR format, ...) { static TCHAR DbgMsg[DBG_MAX_BUFFER_SIZE]; size_t len; TCHAR *p = DbgMsg; va_list args; va_start(args, format); StringCchVPrintf(p, sizeof(DbgMsg) - 1, format, args); StringCchLength(DbgMsg, sizeof(DbgMsg) - 1, &len); p += len; va_end(args); *p++ = '\r'; *p++ = '\n'; *p = '\0'; OutputDebugString(DbgMsg); } #endif // DBG