Showing posts with label Visual Studio. Show all posts
Showing posts with label Visual Studio. Show all posts

Saturday, January 3, 2009

工具介绍 Microsoft Spy++

这是一个Visual Studio自带的工具. 这个工具什么时候有用呢?主要两种情况
1.编写要操作其他程序的程序.
2.是想观察其他程序的窗口属性,分析它是怎么实现的.

以前在不熟悉windows操作系统结构的时候,想编写一些操作系统辅助程序,老是遇到一些奇奇怪怪的问题.
时间长了之后才明白Windows的窗体结构...是一棵树..
然而从这里就可以一目了然地看出来.

还可以查看窗体的STYLE和CLASS,不过这个程序还是有些问题的.STYLE可能显示不标准.尤其是组件的STYLE.


最上面的图中, 灰色的图标表示不可见的Window,蓝色的是可见Window(包括最小化的啥的..)
窗体太多,想判断哪个对应哪个不太容易, 最基础的方式是看名称.
对于有些窗体,可以使用窗体高亮的功能:


最绝的是打开窗体属性,看窗体位置...,哈哈,这个基本上是无误的.


同时它还可以查看各个进程和线程的属性的功能, 使用一下, 还是很实用的.

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",来看效果

个人感觉非常的实用哈.

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的开始处. 这样它就可以工作了, 他主要是进行一些初始化的工作.