2011年7月12日 星期二

處理 side by side error

一些CRT的 Background

  • Visual C++ compile 時link 的 C runtime library 位置
    • C:\Program Files (x86)\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT
  • Windows update 時除了update OS本身之外, 會順便update microsoft出的 application(VC++).  所以也會 update 你的C runtime library.
  • 查目前被update到那一個版本
    • C:\Program Files (x86)\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest
  • link 的rule
    • 有裝VC的host 會link VC底下的
    • 沒有裝VC的host 執行 exe call到CRT 時 link c:\Windows\winsxs 底下的 library (SXS就是side by side的縮寫)
  • Download vcredist_x86

所以如果HOST OS 的VC有被update 過 而guest OS裡的CRT沒有被update到 直接copy host的exe到guest就會出現side by side error

解法:  再裝library 到guest OS 中 (網路上找到的名字通常會是 vcredist_x86.exe 這種名字, 就是在裝library 到你的winsxs, 下載參考上面background)

如何找相對應的vcredist_x86 or x64.xe

方法一.首先先用你需要的CRT version 比如 8.0.50727.4053 在 windows support 找到KB文章 和資訊安全佈告欄link 或number 如MS09-035 裡面有這個更新的內容和應該下載的點 如果沒有link 而只有number就用number 找technet 如用 MS09-035的找到的link 

方法二. 也可以在找到KB文章之後 捲到最後keyword找到KB number再用kb number到download center 找相對應的下載

2011年7月11日 星期一

string call by ref/value in foreach/function

use strict;
sub modifyString
{
    my @param=@_;
   
    foreach (@param)
    {
        $_ =~ s/aaa/bbb/;
        print "param member =$_\n";
    }
    print "param[0] out of loop=$param[0], foreach directly modify member\n";
    return $param[0];   
}

my $string1="aaa";
my $string2="aaa";
modifyString($string1);
$string2 = modifyString($string2);
print "string1 =$string1 will restore to its original value (not call by reference)\n";
print "string2 =$string2 (only if you assign by functoin return value, the string changes\n";

 

image

[ebook] perl 學習手札

http://easun.org/perl/perl-toc/