過去的一周對于我仍然是平淡的一周,但是對于許多許多受到地震災難傷害的人,對于中國,這是難忘難熬的一周。5.12的7.8級地震,加上今天凌晨的6級地震,給不少人帶來痛苦,傷害。地震這個東西很難預知,又有誰能夠正確的預測未來呢?商周時的西伯侯會算算卦,可是妲己帶來的災禍他大概也沒算到。周四,我們派對的學習活動,看了復興之路的前兩集,許多革命者讓我敬佩,尤其是孫中山,看過他的一些精彩的演講文。未來太多未知,就像happy tree friend里的那些短片,事件有時候來的那么突然,不要害怕,樂觀面對,克服困難,如果hp掉光了,那也許不是結束 而是新的開始。豆瓣上有人轉發了一篇哀悼貼,為作者感到同情,同時佩服作者的堅強。
這周仍然是隨便看看技術書籍,認識了blankyao,關注web開發的同齡朋友,對于Hook做了一些小小的學習,實踐日志也發在博客上了。下一段時間可能不能把時間都放在這方面了,考試逼近,考研的復習也沒有開始。不過還是學習技術優先級高些,還是慢慢積累經驗。兄弟去做IBM的實習生面試沒時間,替他做了個迅雷實習生的C++在線題目,頭一次做這類題目,覺得題目比較冗繁,不少題目本身都有些錯誤,題目出的不夠仔細。今天半天在做算法導論課程的上機作業,發現vc8的STL的堆算法和優先隊列好像對于結構體指針的操作有點問題,debug版會提示異常,以后有空再深入學習吧。
本周收藏:
本周看了一個叫做Mind Game的動畫,大部分沒看懂,關于過去和未來以及幻想的動畫,三體這本有趣的科幻小說看了一大半。未來的你我世界對我來講是都個未知,勇敢面對,勇敢前進吧,正如右圖這個圖書館戰爭的ED曲changes,食指所指的是未來。迎接未來,擁抱變化。愿災難就此結束,期待明天。明天能看到★★嗎?
寫完這些發現“明天”已經到了,so。。下周(或者這周)再接著回顧了。
這兩天對于HOOK的技術有了一個入門的學習,用過vista的同學會發現vista重命名一個文件比如vista.exe,他會自動選中vista忽略掉擴展名,帶來比較方便的用戶體驗,學了一些hook我也想試試xp下能不能做這樣的事情。于是參考一些文章,勉強實現了,有一點兒缺陷(請看最后)。
經過觀察我發現重命名時,資源管理器會向他的子窗口listview發送一個LVM_EDITLABELA的控制消息,所以我使用了WH_CALLWNDPROCRET類型的全局掛鉤,這個掛鉤可以在sendmessage結束以后處理傳送和返回的數據。發送了LVM_EDITLABELA消息后,會在lParam得到一個編輯窗口的句柄,只需之后對這個窗口發送EM_SETSEL控制消息就能夠改變重命名時候的高亮區域。hook回調函數如下:
1: static LRESULT CALLBACK msghook(UINT nCode, WPARAM wParam, LPARAM lParam)
2: {
3: if(nCode < 0)
4: {
5: CallNextHookEx(hook,nCode,wParam,lParam);
6: return 0;
7: }
8: LPCWPRETSTRUCT msg = (LPCWPRETSTRUCT) lParam;
9: if(msg->message == LVM_EDITLABELA || msg->message == LVM_EDITLABELW)
10: {
11: GetClassName(msg->hwnd,className,255);
12: GetWindowText(msg->hwnd,wndName,255);
13: if(0==_tcscmp(className,_TEXT("SysListView32")))
14: {
15: if(0==_tcscmp(wndName,_TEXT("FolderView")))
16: {
17: hEditWnd = (HWND)msg->lResult;
18: GetWindowText(hEditWnd,className,255);//暫時放入className
19: SendMessage(hEditWnd,EM_SETSEL,0,findDot(className));
20: }
21: }
22: }
23: return CallNextHookEx(hook,nCode,wParam,lParam);
24: }
className與wndName是兩個TCHAR數組,從hwnd獲取信息存在那里進行判斷是否為Shell中的listview,避免在其它使用listview的應用程序里會進行之后的處理。
工程文件下載,點這里
程序下載,點這里
使用方法,編譯以后直接運行GRnamer就可以,如果不想用了,從任務管理器把它關閉,沒有做trayicon之類的東西,因為只是個demo。
最后說一下缺陷,缺陷就是這樣做沒有辦法判斷文件與文件夾的區別,所以會有如圖的效果,我自己沒有想到解決的方法,請達人們指點。:)
參考的文章:
msdn Hooks hook的全部參考
codeproject Hooks and DLLs 我的hook dll都是照著它寫的。
平常的一周,這周課程不多,編譯原理講了感覺不到一半可能就快要結課了,有點可惜。學的東西不多,寫huffman編碼的練習,用了C++有關的文件流。這周六學校停電,出去買書,想買老六寫的記憶碎片和歌唱80年代,聽說還不錯,可惜沒找到,捧了本ATL internal 2nd的中文版,想買代碼之美中文版,結果老板推薦給我一本編程之美,看了幾眼,也捧了回去。讀書的堆棧還是要不斷更新的。這周閱讀不多,只是了解了些HMAC-SHA的內容,學了一個自適應huffman的代碼,讀那本atl internal,收拾桌面,書架,很累很累,沒做完的事兒很多,云風的那個回憶故事還沒看全,還要寫點東西。
看了幾部動畫,宮崎駿的千與千尋,魔女宅急便,覺得自己一個人傻傻的有點像那個無面人。發現圖書館戰爭里的開場結尾曲很不錯。
本周收藏
本周回顧就是這些,今天是母親節,再次祝媽媽節日快樂。累了,睡去。
前幾天發了這篇《用fstream對二進制文件的讀寫》,有朋友指出了VS2005的fstream對于中文路徑支持不好的bug。我想大概是因為VS2005更加重視了對字符串的全球化支持,所以鼓勵我們使用unicode編碼的字符串,對于MBCS之類的支持可能就疏忽了吧。
我搜索了一下這個問題的解決,參考了如下資料寫了演示代碼。
我綜合了以上的內容,總結了3種方法,能夠較好解決大家的困擾,包括可能無法使用cout的問題。
1: /********************************************************************
2: created: 2008/05/10
3: created: 10:5:2008 23:56
4: filename: k:\sj\fstreamTest\fstreamTest\main.cpp
5: file path: k:\sj\fstreamTest\fstreamTest
6: file base: main
7: file ext: cpp
8: author: Gohan
9: *********************************************************************/
10: #include <tchar.h>
11: #include <fstream>
12: #include <iostream>
13: using namespace std;
14: int main()
15: {
16: /************************************************************************/
17: /* 方法1,使用_TEXT()宏定義將字符串常量指定為TCHAR*類型 */
18: /* 如果是我,首選此類型 */
19: /************************************************************************/
20: fstream file;
21: file.open(_TEXT("c:\\測試\\測試文本.txt"));
22: cout<<file.rdbuf();
23: file.close();
24:
25: /************************************************************************/
26: /* 方法2,使用STL中的locale類的靜態方法指定全局locale */
27: /* 使用該方法以后,cout可能不能正常輸出中文,十分蹊蹺 */
28: /* 我發現了勉強解決的方法:不要在還原區域設定前用cout或wcout 輸出中文 */
29: /* 否則后果就是還原區域設定后無法使用cout wcout輸出中文 */
30: /************************************************************************/
31: locale::global(locale(""));//將全局區域設為操作系統默認區域
32: file.open("c:\\測試\\測試文本2.txt");//可以順利打開文件了
33: locale::global(locale("C"));//還原全局區域設定
34: cout<<file.rdbuf();
35: file.close();
36:
37: /************************************************************************/
38: /* 方法3,使用C函數setlocale,不能用cout輸出中文的問題解決方法同上 */
39: /************************************************************************/
40: setlocale(LC_ALL,"Chinese-simplified");//設置中文環境
41: file.open("c:\\測試\\測試文本3.txt");//可以順利打開文件了
42: setlocale(LC_ALL,"C");//還原
43: cout<<file.rdbuf();
44: file.close();
45: }
補充一下,第一種方法,如果不是靜態字符串當作路徑的話,記得傳入TCHAR*類型字符串作為路徑,應該就沒問題了。
這里介紹使用fstream這個類完成這個任務,fstream在輸入輸出方面比較全能。
操作系統通過二進制文件格式存儲大量文件。一般不指定二進制文件操作的I/O操作是面向文本的,用來讀寫特定編碼的文本。本文介紹用C++的fstream類讀寫二進制文件。
讀寫數據以這個WebSite結構體為例
// Struct for C++ File I/O binary file sample
1: struct WebSites
2: {
3: char SiteName[100];
4: int Rank;
5: };
寫操作
注意事項
- 要寫的文件需要用到輸出模式標志 ios::out和二進制操作模式標志ios::binary。
- write()函數需要兩個參數.第一個參數是char*類型用來指定需要寫入的數據, 第二個參數是int類型指定寫入多少個字節.
- 最后記得要用close()結束.
// Sample for C++ File I/O binary file write
1: void write_to_binary_file(WebSites p_Data)
2: {
3: fstream binary_file("c:\\test.dat",ios::out|ios::binary|ios::app);
4: binary_file.write(reinterpret_cast<char *>(&p_Data),sizeof(WebSites));
5: binary_file.close();
6: }
上面的例子把一個WebSites的對象追加進了c:\test.dat之中,ios::app是追加方式操作文件的標志。
上面的write函數,需要第一個參數為char*類型,所以用 reinterpret_cast轉換將這個對象地址轉換成char*類型.
讀操作
跟上面的操作流程類似. 唯一不同在于使用輸入模式標志ios::in, 使用read()方法.
// Sample for C++ File I/O binary file read
1: void read_from_binary_file()
2: {
3: WebSites p_Data;
4: fstream binary_file("c:\\test.dat",ios::binary|ios::in);
5: binary_file.read(reinterpret_cast<char *>(&p_Data),sizeof(WebSites));
6: binary_file.close();
7: cout<<p_Data.SiteName<<endl;
8: cout<<"Rank :"<< p_Data.Rank<<endl;
9: }
本文只是關于文件io流的一些基礎介紹,一些高級操作比如seek,檢查文件指針的有效性等等,也是需要學習的,這里就不多說了。
文章來源 我只是做一個簡短的翻譯
本周上課3天便碰到了五一,這次短假如同上次的清明長假,勞動光榮,我懶惰得有點慚愧,呆屋3天反省。話說5月1日前一陣被一個叫做Daniel的家伙定為RSS日,RSS很好,高中時候我看很多電腦雜志,用過單機RSS閱讀器,可惜那時候feed不多,去年開始用Google在線閱讀器,感覺良好,上月有兩天google訪問變得很慢,試用了鮮果,發現雖然鮮果的快捷鍵大多學習了Google,但它每篇文章都有推薦數作為參考,可以較快忽略一些不重要的內容,還有分頁顯示,著實不錯,而且好友功能比較顯眼(這個我覺得無所謂),只是像Google這樣用純鍵盤閱讀鮮果的支持就差一些,還是不夠方便,現在覺得還是google稍微方便點,希望Google也去學學鮮果,做的盡善盡美。放假期間看了一點Win shell編程的電子書,看完了那本王濤的.NET須知,以前的ACM隊友還在努力學習算法,我卻有點在這方面荒廢,圖論部分尤其是網絡流至今仍未通曉,打算今后時常讀讀算法導論。
放假要好好放松身心,云風在閑暇時回憶往事,很向往他那會的經歷,只是自己相對他不知荒廢了多少,要努力抓住現在。這周看了一下豆瓣的API文檔,提供了方便的功能,我還需要些基本知識,收集如下,有時間也可以玩這個API的應用。
這周游戲了不少,三國11稱霸模式玩了5關,與同學Dota若干局,一個類似之前的蠟筆物理學的游戲Magic Pen。五一看了很多老電影,臥虎蒼龍,拳霸,冬陰功,預見未來。
本周收藏
這周就到這里,下周繼續。
建立的仍然是Win32 命令行的工程,所以入口點為main(),需要手動獲取HINSTANCE結構。程序在WINXP+VS2005測試通過
/********************************************************************
created: 2008/05/02
created: 2:5:2008 3:40
main.cpp
author: Gohan
purpose: 演示SHBrowseForFolder用法
演示SHGetFileInfo獲取路徑圖標
演示Picture Box在SDK里的使用方法
*********************************************************************/
#include <Windows.h>
#include <ShlObj.h>
#include "resource.h"
HICON g_icon;
RECT g_rect;
TCHAR g_path[MAX_PATH];
void OnInitDlg(HWND hwnd)
{
GetWindowRect(GetDlgItem(hwnd, IDC_ICON1), &g_rect);
MapWindowPoints(NULL, hwnd, (LPPOINT) &g_rect, 2);
DestroyWindow(GetDlgItem(hwnd, IDC_ICON1));
SetDlgItemText(hwnd,IDC_PATH,g_path);
}
void OnPaint(HWND hwnd)
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
DrawIcon(hdc,g_rect.left,g_rect.left,g_icon);
EndPaint(hwnd,&ps);
}
BOOL CALLBACK DlgProc (HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG :
OnInitDlg(hDlg);
return TRUE ;
case WM_PAINT:
OnPaint(hDlg);
return TRUE;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK :
case IDCANCEL :
EndDialog (hDlg, 0) ;
return TRUE ;
}
break ;
}
return FALSE ;
}
int main()
{
HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
BROWSEINFO bi;
ZeroMemory(&bi,sizeof(BROWSEINFO));
LPMALLOC pMalloc;
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
if(pidl != NULL)
{
SHGetPathFromIDList(pidl,g_path);
SHFILEINFO sfi;
ZeroMemory(&sfi,sizeof(SHFILEINFO));
SHGetFileInfo(g_path,0,&sfi,sizeof(SHFILEINFO),SHGFI_ICON);
g_icon = sfi.hIcon;
DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, DlgProc) ;
//MessageBox(NULL,path,TEXT("Choose"),MB_OK);
if(SUCCEEDED(SHGetMalloc(&pMalloc)))
{
pMalloc->Free(pidl);
pMalloc->Release();
}
}
else
{
MessageBox(NULL,TEXT("),TEXT("Choose"),MB_OK);
}
}
/************************************************************************/
/* resource.h */
/************************************************************************/
#define IDD_DIALOG1 101
#define IDC_PATH 1001
#define IDC_ICON1 1002
/************************************************************************/
/* demo.rc Microsoft Visual C++ generated resource script. */
/************************************************************************/
#include "resource.h"
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_DIALOG1 DIALOGEX 0, 0, 126, 83
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "確定",IDOK,69,7,50,14
PUSHBUTTON "取消",IDCANCEL,69,24,50,14
CONTROL "",IDC_ICON1,"Static",SS_WHITEFRAME | SS_REALSIZEIMAGE,13,10,20,20,WS_EX_TRANSPARENT
LTEXT "靜態",IDC_PATH,14,44,89,21,0,WS_EX_CLIENTEDGE
END
/////////////////////////////////////////////////////////////////////////////

前幾天看到和邪社又一個悲哀的宅,的確很悲哀,年輕的生命被自我終結了。遇到了再大的挫折,還應該看到希望,看看這兩個鏈接,兩條腿特立獨行的狗,沒有肢體的人生,生物的能力可以是超乎想象的,只要你有你的faith。這個悲哀的宅也給我提了個醒,雖然我也算宅,不過還是重視周圍的生活的,這周和同學兩天中打了快四十局乒乓球,早起跟寢室同學打了回籃球,周末去看了少兒勵志片功夫之王,挺不錯的,買了這本《你必須知道的.NET》作為前幾天讀書節送給自己的禮物。本周隨便看了看Windows Shell Programming的一部分,寫java上機作業,還玩了10個小時MARSWOW,玩的時候感覺回到了高考復習的那會兒,這次玩完有點后悔,因為看了大學生的游戲生活。昨天是媽媽生日,這里祝愿媽媽永遠健康快樂。這周在技術方面小小研究了一下.Net的RTFBox控件,準備實現一個RTFtoHTML的程序,以后好方便的貼一些code。
本周收藏:
鉑程齋--國家地理:《科學看武術》完整版 Magic Pen 一個類似之前介紹的蠟筆物理學的游戲 超印速 自己花錢印一本書 血型漫畫 好像最近更新了一些 Main Page - Simple English Wikipedia, the free encyclopedia 學英語專用wiki Coding Horror: Formatting HTML code snippets with Ten Ton Wrecking Balls rtf,html相關 UnRTF - GNU Project - Free Software Foundation (FSF) rtf轉換的開源程序,written in c,好像不支持ansicpg936。 RTF轉換HTML - 青青島 我準備寫的RTFtoHTML準備用這篇文章的思路,通過.Net控件取巧一下。 【編程游戲】編寫一個會劃拳的機器人參加擂臺賽,規則內詳。路過有分。 絕對有意思的想法,我也想去湊湊熱鬧了。 What Makes a Great Developer? 我的目標 一棵樹的生活意見[搞笑組圖] 1,2 《龍珠》新動畫制作決定 又將為我所期待 紅心的故事 三思后行,但不要缺少熱情。我有我的紅心。 這周聽汪峰那首明天,感覺不錯,希望現在不好的事兒明天會變好,好的事兒明天更好,相信明天。