Windows Template Library (WTL) 是一组类似于MFC的类库,它使得图形用户界面(GUI)的开发变得更加容易,同时避免了"真正的MFC"带来的额外开销。然而,默认安装并不支持在Visual Studio中立即使用WTL,编译器无法找到包含WTL头文件的#include指令,即使WTL已经安装。
为了解决这个问题,编写了一个Perl脚本来自动化更新WTL,使其在Visual Studio中可用。用户不需要提供任何输入,所有的参数都将被忽略。将"更新"定义为一个过程,它使得WTL对Visual Studio中的项目可用(即#include指令能够成功地定位到WTL文件)。
首先,假设已经安装了Microsoft Platform SDK,并且至少选择了以下选项:
Microsoft提供的Readme.txt文件指出,只需将WTL源目录中的头文件复制到编译器查找#include指令时搜索的包含目录之一即可。MS SDK安装程序将路径%MSSDK%/Include/Atl30注册为第一个包含目录。因此,脚本首先查找"MSSDK"环境变量的值(SDK安装路径)。然后,将%MSSDK%/Include/Atl30(目标)中的文件与%MSSDK%/Src/WTL/Include(源)中的文件进行更新。
更新过程会评估目标文件(如果有的话)和源文件之间的时间戳差异。每次比较可能有以下结果之一:
也可以使用这个脚本来更新MSSDK的后续版本。在安装了新的Platform SDK之后,脚本将确保%MSSDK%/Include/Atl30包含当前版本的WTL源文件(所有旧文件将自动替换为新(已安装)版本)。
另一种更新WTL的方法是更新Visual Studio扫描的目录列表,当它查找#include文件时。这个脚本试图遵循WTL的readme.txt中的建议。
更新不仅仅是源代码,还包括应用程序向导文件。这意味着将awx文件从WTL安装目录复制到Visual Studio向导目录。唯一的问题是如何定位Visual Studio的安装路径...
以下是Perl脚本的一个简单示例,用于更新WTL:
#!/usr/bin/perl
use strict;
use warnings;
# 定义MSSDK环境变量的路径
my $mssdk_path = $ENV{'MSSDK'};
# 定义源目录和目标目录
my $source_dir = "$mssdk_path/Src/WTL/Include";
my $target_dir = "$mssdk_path/Include/Atl30";
# 更新WTL文件
sub update_wtl {
my ($source, $target) = @_;
# 检查源文件和目标文件的时间戳
if (-e $target) {
my $source_time = (stat($source))[9];
my $target_time = (stat($target))[9];
if ($source_time > $target_time) {
print "更新文件: $target\n";
copy($source, $target) or die "无法复制文件: $!";
} elsif ($source_time < $target_time) {
print "警告: 目标文件比源文件新,不更新: $target\n";
} else {
print "目标文件和源文件时间戳相同,不更新: $target\n";
}
} else {
print "目标文件不存在,复制源文件: $target\n";
copy($source, $target) or die "无法复制文件: $!";
}
}
# 遍历源目录中的所有文件,并更新目标目录中的文件
opendir(my $dh, $source_dir) or die "无法打开目录: $!";
while (my $file = readdir($dh)) {
next if $file =~ /^\.\.?$/; # 忽略.和..目录
my $source_file = "$source_dir/$file";
my $target_file = "$target_dir/$file";
update_wtl($source_file, $target_file);
}
closedir($dh);