發表文章

如何防止 Windows 重新啟動或關機

一般 MFC Dialog base 的程式,我們會在 OnInitDialog() 做一些初始化的動作;然後在 PostNcDestroy() 做一些清除資源,或將資料寫回 HD 的動作。 但在 Windows 重新啟動或關機的情況下,是不會執行到 PostNcDestroy() 的,這時就會造成一些程式動作未完成。 Windows 有兩個 Message 跟重新啟動或關機有關: WM_QUERYENDSESSION  :詢問程式是否可關機,回傳 TRUE 表示可以,FALSE 則不行。此外 lParam 會指出一些程式關閉的情況,不過在 MFC OnQueryEndSession() 都省略掉了。 WM_ENDSESSION :程式執行完 WM_QUERYENDSESSION 後呼叫 (不論其傳回結果為 TRUE 或 FASE),其傳回結果會反應在 wParam;而 lParam 的內容同 WM_QUERYENDSESSION,不過在 MFC OnEndSession() 一樣被省略了。 所以這兩個地方都可以拿來做跟 PostNcDestroy() 一樣的工作,差別在 WM_QUERYENDSESSION 可以傳回 FALSE 來阻止 Windows 重新啟動或關機而己。

[已解決] side-by-side error

圖片
好久沒有寫心得了,最近寫程式拿到另一個平台執行時,發生以下問題 原因是我的程式需要 MFC DLL,Debug version 使用 Share library,而新的平台並未安裝對應的 DLL,導至程式執行時找不到,所以就產生問題了 另外 Release version 使用 Static library,內建在程式中,所以就沒問題 而開發平台有安裝對應的 DLL,所以總是看不到問題,下次如果要部署 Share library 版本,記得在安裝程式中安裝對應的 DLL 版本。

【已解決】CResourceException 異常處理

圖片
最近開發一個自訂控制項,當視窗經過多次放大、縮小後就會產生 First-chance exception at 0x000007fefcfe940d in XXX_x64.exe: Microsoft C++ exception: CResourceException * __ptr64 at memory location 0x0027b360.. First-chance exception at 0x000007fefcfe940d in XXX_x64.exe: Microsoft C++ exception: CInvalidArgException * __ptr64 at memory location 0x00276b90.. Warning: Uncaught exception in WindowProc (returning 0). 經過搜尋的結果,應該是使用資源後未釋放,造成資源耗盡。問題是沒有捕捉到產生異常的地方,要修改也無從下手。於是先用 try catch 在有可能的地方試試看

[已解決] Ubuntu 12.04 LTS 無法連接網路

日前在公司的 Z87 主機板上安裝 Ubuntu 12.04 LTS 後,才發現網路無法使用,經過一番 Google 後才知道是晶片太新,Ubuntu kernel 不支援,只好手動安裝 Driver 了。所幸不太複雜,為了怕以後還要再來一次,所以就先記錄一下。 首先到 Network Adapter Driver for PCI-E Gigabit Network Connections under Linux* 下載 Driver 接下來三個步驟就搞定了 tar zxf e1000e-<x.x.x>.tar.gz cd e1000e-<x.x.x>/src/ sudo make install sudo modprobe e1000e insmod e1000e 參考:intel Network Connectivity Linux* e1000e Base Driver overview and installation 2013/9/16 今天的 Ubuntu 網路忽然又不能用了,於是又讀了一遍 e1000e 的 Readme,發現有可能是舊版的 e1000e Driver 所造成的,於是依照下列的步驟:先移除舊的,然後再安裝一次就 OK 了! sudo rmmod e1000e sudo modprobe e1000e

利用 GRUB2 掛載 ISO 檔安裝 OS

以前要安裝新的 OS 總是要利用光碟片來開機才能安裝,但最近碰到光碟機會挑片,無法讀取單面雙層的 DVD,每次要安裝還得跟別人借光碟機,實在有夠麻煩! 後來偶然間看到 Grub2/ISOBoot 才發現:原來 GRUB2 不只可以掛載 Partition,也可以掛載 ISO 檔模擬成光碟機 (類似 Windows 下的虛擬光碟機),這樣就可以安裝了,而且速度還比實體光碟機快多了,反正現在硬碟空間那麼大,不在乎存放 ISO 檔的那一點點空間!

使用 googletest & googlemock 做單元測試

svn checkout http://googlemock.googlecode.com/svn/trunk/ (已包含 googletest) 將來可以直接用 svn update 為了方便將這兩個 Framework 加入測試專案,將輸出目錄由 SolutionName 改為 SolutionDir ,避免附加到不同的 Solution 時造成名稱不一致 (後來發現一般  Project 都是用 SolutionDir,唯獨這兩個 Project 使用 SolutionName,怪哉!) 開啟 googlemock\gtest\msvc\gtest-md.sln,點選 gtest-md 的 Properties,選擇 All Configurations,將 General | Output Directory 由 $(SolutionName)/$(ConfigurationName) 改為  $(SolutionDir)/$(ConfigurationName) 開啟 googlemock\msvc\2005\gmock.sln 點選 gmock 的 Properties,選擇 All Configurations,將 General | Output Directory 由 $(SolutionName)/$(ConfigurationName) 改為  $(SolutionDir)/$(ConfigurationName) 選擇 Debug Configuration,將 C/C++ | Code Generation | Runtime Library 由 Multi-threaded Debug (/MTd) 改為 Multi-threaded Debug DLL (/MDd) 選擇 Release Configuration,將 C/C++ | Code Generation | Runtime Library 由 Multi-threaded (/MT) 改為 Multi-threaded DLL (/MD) 以上動作設定一次即可 PS : 如果 Project Runtime Library  使用 Multi-threaded (Deb...

scanf 兩三事

圖片
記得以前寫程式的時候,scanf 是很常用到的輸入功能。但寫 Windows 程式後就很少碰到它了,直到之前發生了一些靈異現像,才重新勾起對它的回憶。首先看看以下的程式碼吧 int _tmain(int argc, _TCHAR* argv[]) { short int i=0, j=0; _tprintf(_T("Please input number : ")); _tscanf_s(_T(" %d "),&i); _tprintf(_T("i = %d, j = %d\n"), i, j); return 0; }