Monday, December 29, 2008

ERROR查询器介绍 (Visual Studio 自带)

以前本地MSDN文档用的最多的就是error表.每次都查来查去.
后来发现Windows via C/C++上介绍了Visual Studio自带了一个非常使用的小工具: Error Lookup.

哈哈,这个就是上一个帖报的错. 查询后, 就是下面的样子.

想找到这个程序很简单
我把VS装在默认目录,它就在"C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools"下,叫errlook,是一个MFC程序.

其实还有一个更加简单的方法:调试的时候在watch中输入"$err,hr",来看效果

个人感觉非常的实用哈.

error 1406 Cannot create a top-level child window.

我在主窗体的WM_CREATE事件中创建一个子窗体.变报了标题里的这个错.
CreateWindowEx(WS_EX_CLIENTEDGE| WS_EX_ACCEPTFILES,
WC_LISTBOX, TEXT(""),
WS_CHILD|WS_VISIBLE|WS_VSCROLL|LBS_NOTIFY ,
0, 0, 100, 100, hWndWindowMain,
NULL, hInst, NULL);


hWndWindowMain是主窗体的句柄, 是主窗体的CreateWindowEx的返回值.

这个问题其实很简单, 之所以可以拿出来晒, 是因为遇到类似的问题的时候, 我们通常挨个检查style有没有错.
但是发现style一切正常后,就觉得...啊... 灵异事件啊..

其实问题的实质在hWndWindowMain上, 报错说是"Cannot create a top-level child window. "
为什是"top-level"呢? 原来hWndWindowMain还没有建立, 主窗体的CreateWindowEx还没有返回, 他现在不是一个有效的句柄.

所以, hWndWindowMain换成消息循环的主窗口句柄就可以了.
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
.....
CreateWindowEx (WS_EX_CLIENTEDGE| WS_EX_ACCEPTFILES,
WC_LISTBOX, TEXT(""),
WS_CHILD|WS_VISIBLE|WS_VSCROLL|LBS_NOTIFY ,
0, 0, 100, 100,
hWnd , NULL, hInst, NULL);

Wednesday, December 24, 2008

使用 Visual Studio 2008 / 2005 发布一个 Win32 程序 , 不使用 MFC/ .NET .

你是否尝试过使用 Visual Studio 2008 / 2005 编译一个C++软件给别人用, 但是如果别人没有安装.NET,它会提示XXXX.dll找不到,或者文件已经损坏.

首先想到的是使用Release状态编译发布就OK了, 这个在VC6可行, 但是在这里也不行, 同样是上面的错误.
仅仅是一个win32程序,难道还要随身带个dll...

可能是这个原因, N多老师说VS只能做.NET程序,然后说MS... 然后回去用VC6了.

当时在Google上搜了好几天也没发现理想的答案.
大多数人的解决方案是加入静态MFC库, 这样的解决方案其实是歪打正着~

后来, 在仔细研究VS工程的参数后, 发现工程配置里面一个可疑的东东~
Code Generation里面的Runtime Library.

原来.要在Visual Studio发布一个Win32工程,首先要使用Release模式.
其次,要在工程的属性做以下修改.



可是为什么微软要把工程是属性的默认值改得这么不人性化捏...
我想应该是有它的原因的,不过我暂时还不知道.

Sunday, December 21, 2008

让Visual Studio的C++窗体程序拥有系统主题 (XPSTYLE)

Windows的控件的样式有两种, 一般大家把第一种叫Classic, 另一种叫Themed.
在Visual Studio写程序,如果用.NET,默认都拥有"系统"样式.

但是默认的C++的Win32工程编译运行后却是下面这个样子.

事实上,左边的就是Classic状态,右边的是Themed状态.
这个其实是可以由Manifest文件控制的.控制Manifest的方法有好几个, 但是方便的做法是在代码里面加上链接参数:
在代码中中加上.
#include <commctrl.h>
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#pragma comment(lib,"comctl32.lib")

然后在代码中运行:
InitCommonControls();
最好是加载WinMan的开始处. 这样它就可以工作了, 他主要是进行一些初始化的工作.

Wednesday, December 17, 2008

开博, 了

哈哈, 这次跟以往不一样哈.
因为这次工作的压力越来越大了哈. 加油加油

首先说说为什么开这个.
这次我不是闲得蛋疼,也不是想开个赚钱的网站.
毕业临近,可以我始终觉得自己离我的目标还是有太远距离. 这个的确是一个越来越严重(chong)的问题.怎么解决呢?:做该做的事情,少花时间在一些无聊的事情上.写些东西提醒自己.顺便顺便将一些东西转化为可以用的价值.

再说说要写些什么捏.
牢骚... 作为自己的网站,不发点牢骚怎么行...
程序发布... 做为一个未来的程序员,肯定是有点自己的作品啦.. 来这发布发布..
经验总结...
技术文档... 这两点其实差不多,也是对别人来说可能更有价值的东西.

最后...(牢骚)
域名真贵啊....
网站程序 最初为自架的WordPress, 后来搬家到Blogger.