5
我試圖將MSI產品代碼GUID轉換爲用於標識MSI註冊表項中已安裝項目的產品代碼ID。有這樣的API嗎?如果沒有,那怎麼辦?來自產品ID的MSI產品代碼?
我試圖將MSI產品代碼GUID轉換爲用於標識MSI註冊表項中已安裝項目的產品代碼ID。有這樣的API嗎?如果沒有,那怎麼辦?來自產品ID的MSI產品代碼?
警告!微軟強烈建議你不要惹他們的MSI註冊表項,但如果你真的必須的,這裏是一個常規的翻譯GUID在註冊表中使用的密鑰格式標準的產品代碼:
private static string TranslateMsiProductCode(Guid productCode)
{
// 93 CE EF F6 AA 3D 4E 99 84 E1 8F FB F7 2C 43 0D <--- Source
// 6F FE EC 39 D3 AA 99 E4 48 1E F8 BF 7F C2 34 D0 <--- Target
// ----------- ----- ----- -----------------------
// 01 23 45 67 89 01 23 45 67 89 01 23 45 67 89 01
// 0 1 2 3
// examples:
// {93CEEFF6-AA3D-4E99-84E1-8FFBF72C430D} -> 6FFEEC39D3AA99E4481EF8BF7FC234D0
// {0E837AF0-4C92-4077-83F0-D022073F17C0} -> 0FA738E029C47704380F0D2270F3710C
// {4AE61EA4-9F6F-4616-9035-0CF343EA462D} -> 4AE16EA4F6F961640953C03F34AE64D2
string input = productCode.ToString("N").ToUpper();
StringBuilder newString = new StringBuilder(input);
newString[0] = input[7];
newString[1] = input[6];
newString[2] = input[5];
newString[3] = input[4];
newString[4] = input[3];
newString[5] = input[2];
newString[6] = input[1];
newString[7] = input[0];
newString[8] = input[11];
newString[9] = input[10];
newString[10] = input[9];
newString[11] = input[8];
newString[12] = input[15];
newString[13] = input[14];
newString[14] = input[13];
newString[15] = input[12];
newString[16] = input[17];
newString[17] = input[16];
newString[18] = input[19];
newString[19] = input[18];
newString[20] = input[21];
newString[21] = input[20];
newString[22] = input[23];
newString[23] = input[22];
newString[24] = input[25];
newString[25] = input[24];
newString[26] = input[27];
newString[27] = input[26];
newString[28] = input[29];
newString[29] = input[28];
newString[30] = input[31];
newString[31] = input[30];
return newString.ToString();
}
這裏的我在Perl中做了什麼,在尋找一種更優雅的方式時,我偶然發現了這個問題(迄今爲止沒有運氣)。
use strict;
use warnings;
my $guid;
if (shift() =~ /\{([0-9A-F\-]+)\}/)
{
$guid = $1;
}
die "Usage $0: <guid>\n" unless $guid;
my @sections = split /-/, $guid;
die "Malformed guid $guid\n" if @sections != 5;
my $str;
for (my $i = 0; $i < 3; ++$i)
{
$str .= reverse($sections[$i]);
}
my @tmp = split //, join('', @sections[3,4]);
for(my $i = 0; $i < @tmp; $i += 2)
{
$str .= join('', @tmp[$i+1, $i]);
}
print "$str\n";
不錯!看起來有一些機會來簡化字符交換和字符串反轉,但是謝謝! – 2009-12-11 18:40:17
這個例程在這裏寫得稍微好一點:http://stackoverflow.com/questions/17936064/how-can-i-find-the-upgrade-code-for-an-installed-application-in-c – 2014-07-07 15:13:19