文章关键字 ‘VC’

VC++7到VC6++工程的转换工具

2011年05月14日,星期六

一、简介
这个工具自动将VC7工程转换回VC6工程,换言之,就是将.sln/.vcproj这两个文件转换到.dsw/.dsp文件。
注意:本转换器在转换期间只是建立(或覆盖).dsw/.dsp文件,并没有改变任何源代码。

(更多…)

Visual C++ 常用的文件扩展名

2010年10月11日,星期一

用Visual C++时间也不短了,但是从来没有去研究过它生成的那些乱七八糟的文件有什么用。今天特地查了一下,只列出我感兴趣的,详细的资料请查看参考链接。

  • .APS – 二进制形式的资源文件:
    这种文件是二进制形式的当前资源文件。App Studio 或资源编辑器使用该文件进行快速加载。
  • .PCH – 预编译头文件:
    这些文件可以大大提高编译速度。如果使用 /Yc、/Yu 或 /YX 编译器选项,将创建这些文件。
  • .PDB – 程序数据库文件:
    这种二进制文件中包含在编译和链接项目过程中收集的类型和符号形式的调试信息。这种文件用于 Visual C++ 调试器。对象文件包含对 .PDB 文件中有关调试信息的引用。这种设计减小了对象文件的大小。有关更多信息,请参见 /Zi 开关下的联机参考。使用 /Z7 开关时,并不创建这种文件。
  • .NCB – 分析器信息文件:
    这种文件包含类视图和组件库使用的分析器生成的信息。如果这种文件被有意或无意删除,它会自动重新生成。

参考链接:INFO:Visual C++ 常用的文件扩展名

VC6中使用高版本API的方法

2010年10月10日,星期日

今天用VC6重新编译一个以前写过的程序。程序中使用了API函数SetWindowsHookEx,某段代码如下

SetWindowsHookEx(WH_KEYBOARD_LL,KeyHookProc,hInstance,0);

Visual Studio 2008太大了我没有安装,只安装了Visual C++ 6.0和Microsoft Platform SDK February 2003。这个程序以前用VC9(即VC2008)编译没有任何问题,但是今天用VC6编译的时候竟然报错:

error C2065: 'WH_KEYBOARD_LL' : undeclared identifier

MSDN文档上说WH_KEYBOARD_LL要求系统必须至少为Windows NT/2000/XP,我的系统是Windows 2008 R2,怎么还会报错说未定义呢?百思不得其解。

文档说WH_KEYBOARD_LL Declared in Winuser.h,好吧,我就打开Winuser.h看了一下,终于找到了原因:

#if (_WIN32_WINNT >= 0x0400)
#define WH_KEYBOARD_LL     13
#define WH_MOUSE_LL        14
#endif // (_WIN32_WINNT >= 0x0400)

罪魁祸首就是这个_WIN32_WINNT,只有当它大于0x0400的时候才定义WH_KEYBOARD_LL。

(更多…)

在VC中编译运行程序的小知识点

2010年09月21日,星期二

1、Run-Time Library

Run-Time Library是编译器提供的标准库,提供一些基本的库函数和系统调用。
我们一般使用的Run-Time Library是C Run-Time Libraries。当然也有Standard C++ libraries。
C Run-Time Libraries实现ANSI C的标准库。VC安装目录的CRT目录有C Run-Time库的大部分源代码。

C Run-Time Libraries有静态库版本,也有动态链接库版本;有单线程版本,也有多线程版本;还有调试和非调试版本。
可以在"project"->"settings"->"C/C++"->"Code Generation"中选择Run-Time Library的版本。

动态链接库版本:
/MD Multithreaded DLL                    使用导入库MSVCRT.LIB
/MDd Debug Multithreaded DLL       使用导入库MSVCRTD.LIB

静态库版本:
/ML Single-Threaded                       使用静态库LIBC.LIB
/MLd Debug Single-Threaded          使用静态库LIBCD.LIB
/MT Multithreaded                           使用静态库LIBCMT.LIB
/MTd Debug Multithreaded              使用静态库LIBCMTD.LIB

C Run-Time Library的标准io部分与操作系统的关系很密切,在Windows上,CRT的io部分代码只是一个包装,底层要用到操作系统内核kernel32.dll中的函数,在编译时使用导入库kernel32.lib。这也就是为什么在嵌入式环境中,我们一般不能直接使用C标准库。

(更多…)

VC编写在Windows 7下需要管理员权限的程序

2010年08月26日,星期四

和实现XP风格一样,也是通过manifest文件,下面的manifest包括了XP风格的选项

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
          manifestVersion="1.0"> 
<dependency> 
    <dependentAssembly> 
        <assemblyIdentity 
            type="win32" 
            name="Microsoft.Windows.Common-Controls" 
            version="6.0.0.0" 
            processorArchitecture="X86" 
            publicKeyToken="6595b64144ccf1df" 
            language="*" 
        /> 
    </dependentAssembly> 
</dependency> 
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel 
                level="requireAdministrator" 
                uiAccess="false"/>
        </requestedPrivileges>
    </security>
</trustInfo>
</assembly>

保存为uac.manifest,导入到资源文件中,资源类型为24,ID为1(必须为1),重新编译即可。

参考链接:Vista UAC: The Definitive Guide