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模式.
其次,要在工程的属性做以下修改.



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