HOOK编程时,需要将DLL注入到其他进程。如果需要使用一些共享数据,则容易出现一些莫名其妙的问题。如内存越界,无法更新共享的全局变量数据。代码形式如下:
#pragma data_seg(".SEG_HOOK")
HWND g_hWnd = NULL;
HHOOK g_hHookKb = NULL;
HHOOK g_hHookMos = NULL;
TCHAR szText[MAX_PATH] = _T("");
#pragma data_seg()
#pragma comment(linker, "/SECTION:.SEG_HOOK,RWS")
HWND g_hWnd = NULL;
HHOOK g_hHookKb = NULL;
HHOOK g_hHookMos = NULL;
TCHAR szText[MAX_PATH] = _T("");
#pragma data_seg()
#pragma comment(linker, "/SECTION:.SEG_HOOK,RWS")
std::vector排序问题,可将struct作为成员放进class,再利用重载实现排序,但这样的实现比较繁琐。其实,利用STL本身的排序算法,也是可以实现排序的。以下是实现代码,在VC2005下测试通过。注:2007-10-10修正两个bug。
有时不想用SEH,主要是考虑到效率上的问题。这时,有两种可行的替代,各有利弊。其中,func2的while(false)还会导致VS2005在Level 4 (/W4)下的一个警告:warning C4127: conditional expression is constant。
升级到VS2005之后,总感觉VS2005反应迟钝,尤其是在关闭项目时。如果项目在U盘里使用,则在关闭项目时肯定导致IDE无响应,而且,也无法在Debug和Release之间自由切换,一换,IDE必死,等待多久也不行。
今天无意间搜索google,发现了VS2005的最新补丁发布页面:
http://connect.microsoft.com/VisualStudio/content/content.aspx?ContentID=3705
不过,下载之前需要注册Microsoft Connect。注册的过程比较繁琐,注册成功后就可以下载里面的补丁文件了。
另,这个blog中的信息比较,做个记号:http://steve.chinavfx.net
找到了几个相关补丁,安装后,上述问题解决!
今天无意间搜索google,发现了VS2005的最新补丁发布页面:
http://connect.microsoft.com/VisualStudio/content/content.aspx?ContentID=3705
不过,下载之前需要注册Microsoft Connect。注册的过程比较繁琐,注册成功后就可以下载里面的补丁文件了。
另,这个blog中的信息比较,做个记号:http://steve.chinavfx.net
找到了几个相关补丁,安装后,上述问题解决!
一直在逃避使用VS2005,主要原因:
⒈ 非托管编码,以为必须带上VC8的DLL,其实通过静态链接(/MT),是可以避免的!
⒉ 需要安装.NET2.0,无法使用绿色版(VC2003可以做成绿色版,可在任何一台2k以上使用)。
而选择使用VS2005,又是因为:
⒈ RC文件支持Unicode,这样可以在版本说明里使用 © 了。
⒉ About对话框支持 ©,免得再SetWindowText+0xA9了。
⒊ 可以使用_tcsnlen函数,以防止可能的缓冲区溢出了。虽然之前可以使用safestr.h里的StringCchLength函数,但太过烦琐,用着实在是不爽!比如:
⒈ 非托管编码,以为必须带上VC8的DLL,其实通过静态链接(/MT),是可以避免的!
⒉ 需要安装.NET2.0,无法使用绿色版(VC2003可以做成绿色版,可在任何一台2k以上使用)。
而选择使用VS2005,又是因为:
⒈ RC文件支持Unicode,这样可以在版本说明里使用 © 了。
⒉ About对话框支持 ©,免得再SetWindowText+0xA9了。
⒊ 可以使用_tcsnlen函数,以防止可能的缓冲区溢出了。虽然之前可以使用safestr.h里的StringCchLength函数,但太过烦琐,用着实在是不爽!比如:
int main()
{
TCHAR sz[] = _T("1234567890");
cout << _tcsnlen(sz, 5) << endl;
sz[_tcsnlen(sz, 5)] = 0;
wcout << sz << endl << _tcslen(sz) << endl;
return 0;
}
{
TCHAR sz[] = _T("1234567890");
cout << _tcsnlen(sz, 5) << endl;
sz[_tcsnlen(sz, 5)] = 0;
wcout << sz << endl << _tcslen(sz) << endl;
return 0;
}





2007/10/19

