Tôi đang cố gắng xác định múi giờ hiện tại cho hệ thống Windows. Đoạn mã sau là (lỏng lẻo) dựa trên câu trả lời bằng @MattJohnson về chủ đề này: Getting local timezone identifier when OS display language is non-englishHKLM SYSTEM CurrentControlSet Control TimeZoneInformation TimeZoneKeyName bị hỏng?
using (RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\TimeZoneInformation"))
{
if (registryKey != null)
{
string windowsTimeZoneId = registryKey.GetValue("TimeZoneKeyName") as string;
if (string.IsNullOrEmpty(windowsTimeZoneId))
windowsTimeZoneId = registryKey.GetValue("StandardName") as string;
if (!string.IsNullOrEmpty(windowsTimeZoneId))
{
int i = windowsTimeZoneId.IndexOf('\0');
if (i != -1)
windowsTimeZoneId = windowsTimeZoneId.Remove(i);
return ConvertFromWindowsId(windowsTimeZoneId);
}
}
}
Nếu tôi đặt một breakpoint trên dòng đầu tiên "if (string.IsNullOrEmpty (windowsTimeZoneId))", thì đây là những gì tôi thấy trong trình gỡ lỗi Visual Studio:
Điều gì đang xảy ra ở đây? RegistryKey.GetValue() là trả về một chuỗi đóng hộp, nhưng tại sao nó không phát hiện hai byte 00 byte và chấm dứt chuỗi đó?
Cho đến nay tôi đã thử nghiệm điều này trên hai máy tính cá nhân của mình. Điều này là từ một trong đó chạy Windows 7 64-bit. Một cái khác, chạy Windows 7 32-bit, là giống nhau ngoại trừ việc nó nói rằng độ dài của chuỗi được trả về là 128 ký tự thay vì 127.
Khi nhìn vào mục đăng ký với regedit.exe có vẻ ổn, chỉ hiển thị "Romance Standard Time".
Một chút Googling đã bật câu hỏi này https://social.msdn.microsoft.com/Forums/sqlserver/en-US/eca7ad76-c910-46be-8fb9-876c7cde5c69/registry-read-time-zone-info-differ-when-code-build-on-40-framework-on-host-system-win-7-64-bit?forum=csharpgeneral Nếu không, tôi không thể tìm thấy bất kỳ điều gì.
Chương trình đang được xây dựng với Visual Studio 2012 và nhắm mục tiêu .Net 2.0. Như bạn có thể thấy, tôi đã thêm mã để đưa kết quả "bị hỏng" này vào tài khoản, nhưng tôi vẫn đánh giá cao nếu ai đó có thể giải thích cho tôi điều gì đang xảy ra ở đây và thậm chí có thể làm cách nào để tránh toàn bộ vấn đề.
EDIT:
Chương trình đang được xây dựng với Visual Studio 2012, và nhắm mục tiêu Net 2.0.
Hmm, cốt truyện dày hơn. Tuyên bố đó không hoàn toàn chính xác. Gốc của mã được hiển thị ở trên là trong một thư viện lắp ráp được xây dựng để nhắm mục tiêu .Net 2.0, nhưng nó đã được gọi từ một chương trình nhắm mục tiêu .Net 4.0. Bây giờ tôi đã cố gắng gọi nó từ một chương trình mà mục tiêu. Net 2.0, và không có vấn đề, RegistryKey.GetValue() chỉ đơn giản là trả về "Romance Standard Time". Vì vậy, nó xuất hiện rằng nó không có cái gì để làm với .Net Framework 4.0, như ngụ ý bởi việc đăng trên MSDN.
EDIT 2 - bắt đầu nghĩ rằng đây là "bình thường"
Đây là một chủ đề off-bit cho SO, nhưng tôi muốn đánh giá cao nếu ai đó sẽ có một cái nhìn tại đăng tải liên quan của tôi qua tại superuser. com, vì tôi không nhận được sự hài lòng ngay lập tức ở đó, và tôi muốn giải quyết vấn đề này vì vậy tôi biết liệu tôi có nên vẫn hoảng sợ hay không. Cảm ơn.
https://superuser.com/questions/859031/possible-malware-modification-of-windows-registry-entry
Chi tiết rất thú vị. Cũng lưu ý rằng Giờ chuẩn lãng mạn áp dụng ở châu Âu - không phải Mexico. Vì vậy, không có cách nào điều này được thực hiện cố ý, vì các giá trị không liên quan trong cùng một chuỗi. –
@Matt: Tôi nghi ngờ dữ liệu dư thừa là ngẫu nhiên, chỉ bất cứ điều gì xảy ra trong bộ nhớ khi bộ đệm được cấp phát. Hình như Windows chính nó đang làm điều này; nếu tôi xóa nội dung thừa, sau đó thay đổi múi giờ, nó sẽ xuất hiện trở lại. Có vẻ giống như cùng một dữ liệu mỗi lần, nhưng tôi chưa thử khởi động lại máy để xem liệu nó có làm cho nó trông khác đi không. –