过去的一周对于我仍然是平淡的一周,但是对于许多许多受到地震灾难伤害的人,对于中国,这是难忘难熬的一周。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 《龙珠》新动画制作决定 又将为我所期待 红心的故事 三思后行,但不要缺少热情。我有我的红心。 这周听汪峰那首明天,感觉不错,希望现在不好的事儿明天会变好,好的事儿明天更好,相信明天。