Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 14 kết quả

Đề tài: Tương tác với system registry trong lập trình c#

  1. #1
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Post Tương tác với system registry trong lập trình c#

    Nếu là dân lập trình COM, chắc hẳn bạn không thể tránh khỏi sử khốn khổ khi lập trình với Registry của Windows. Còn nếu bạn sống chung với VS.NET rất ư là thưa thớt, .NET FRAMEWORK đã giảm sự quan trọng của Registry đối với ứng dụng, vì assembly đã trở thành “tự cung tự cấp” do đó assembly không cần thông tin đặc biệt được trữ trên Registry. Registry giờ đây chỉ nơi tiện lợi để bạn lưu trữ thông tin về sở thích của người sử dụng.

    Namespace Microsoft.Win32 định nghĩa một vài lớp cho phép đọc/viết registry một cách dễ dàng. Sau đây là các lớp trong namespace này:
    -Registry: Một trừu tượng hóa cấp cao về bản thân Registry, với tất cả các lớp được gắn liền
    -RegistryKey : Đây là lớp cốt lõi cho phép bạn thêm vào, gỡ bỏ và nhật tu thông tin được trữ trong Registry
    -RegistryHive: Đây chỉ là mỗi khôn tổ ong (hive) trên Registry

    Trước khi đi vào việc tương tác với Registry qua C#, bạn cũng nên biết qua chút ít về Registry trong Windows chứ:
    - Để mở Registry: nhấn menu Start trên thanh taskbar, sau đó chọn RUN, ở hộp thoại RUN vừa hiện ra, gõ vào regedit.


    HKEY_CLASSIES_ROOT (HKCR): chứa những chi tiết về các loại tập tin (.txt,.doc,…) và những ứng dụng nào đó có khả năng mở các tập tin loại nào. Ngoài ra, nó còn chứa những thông tin đăng ký đối với tất cả các cấu kiện COM
    HKEY_CURRENT_USER (HKCU): chứa những chi tiết liên quan đến những sở thích của người sử dụng hiện được đăng nhập trên máy tính.
    HKEY_LOCAL_MACHINE (HKLM): là một hive đồ sộ chứa những chi tiết của tất cả các phần mềm và phần cứng được cài đặt trên máy. Nó cũng bao gồm HKCR hive: HKCR hiện thật sự không phải là 1 hive độc lập tự thân, nhưng đơn giản là một ánh xạ tiện lợi trên Registry key.
    HKEY_USERS (HKUSR): chứa những chi tiết liên quan đến sở thích của tất cả các người sử dụng. Như bạn có thể chờ đợi, nó cũng chứa hive HKCU, đơn giản là 1 ánh xạ lên 1 trong những key trên HKEY_USERS
    HKEY_CURRENT_CONFIG: chứa những chi tiết liên quan đến phần cứng trên máy tính.

    CÁC LỚP .NET REGISTRY:
    Việc truy cập vào Registry trên .NET sẽ thông qua 2 lớp Registry và RegistryKey thuộc namespace Microsoft.Win32. Một thể hiện của lớp Registry Key tượng trưng cho một registry key. Lớp RegistryKey cung cấp những thành viên cốt lõi sau đây cho phép bạn làm việc với một registry key:

    -Name: thuộc tính này tìm lại tên của key (read-only)
    -SubKeyCount: thuộc tính này tìm lại bộ đếm số lượng subkey
    -ValueCount: tìm lại bộ đếm các giá trị trên một key
    -Close(): hàm này cho đóng lại key, và ghi lên đĩa cứng nếu nội dung bị thay đổi
    -CreateSubKey(): hàm này tạo 1 subkey mới hoặc mở 1 subkey hiện hữu. Chuỗi subkey không phân biệt chữ hoa, chữ thường.
    -DeleteSubKey(): hàm này cho gỡ bỏ 1 subkey được chỉ định. Nếu muốn gỡ bỏ những subkey con thì sử dụng đến DeleteSubKeyTree(). Chuỗi subkey không phân biệt chữ hoa, chữ thường
    -GetSubKeyNames(): hàm này cho tìm lại mảng chứa tất cả các tên của subkey
    -GetValue(): hàm này tìm lại trị được khai báo.
    -GetValueNames(): hàm này cho tìm lại 1 bản dãy chuỗi chữ chứa tất cả các tên trị (value name)
    -OpenRemoteBaseKey(): hàm này cho mở 1 RegistryKey mới tượng trưng cho key được yêu cầu trên một máy nằm ngoài.
    -OpenSubKey(): hàm này cho tìm lại SubKey()
    -SetValue(): hàm này cho đặt để 1 trị được chỉ định. Chuỗi subkey không phân biệt hoa thường.

    Lớp RegistryKey là lớp mà chúng ta sẽ dùng để làm việc với registry. Tutorial này sẽ đi sâu vào lớp này.
    Đầu tiên, muốn có 1 thể hiện của 1 RegistryKey, tượng trưng cho key HKEY_LOCAL_MACHINE , bạn viết:
    Visual C# Code:
    1.   RegistryKey Hklm = Registry.LocalMachine;

    Như bạn đã thấy, đối tượng Hklm đơn giản là đang trỏ tới khóa HKEY_LOCAL_MACHINE (HKLM) trong Registry. Cũng không có gì khó hiểu, chúng ta qua bước nữa nhé. Bây giờ, nếu bạn muốn đọc 1 vài dữ liệu trên HKEY_LOCAL_MACHINE\Software\Microsoft, bạn phải lấy qui chiếu về key như sau:
    Visual C# Code:
    1.   RegistryKey Hklm = Registry.LocalMachine;
    2.   RegistryKey HkSoftware = Hklm.OpenSubKey(“Software”);
    3.   RegistryKey HkMicrosoft = HkSoftware.OpenSubkey(“Microsoft”);

    Hàm hành sự OpenSubKey() là 1 trong những hàm bạn sẽ triệu gọi nếu bạn chờ đợi key hiện hữu. Nếu nó không có, thì nó sẽ trả về một null reference. Còn nếu bạn muốn tạo 1 key mới, bạn sẽ dùng hàm CreateSubKey() (hàm này tự động cho quyền Read-Write):
    Visual C# Code:
    1.   RegistryKey Hklm = Registry.LocalMachine;
    2.   RegistryKey HkSoftware = Hklm.OpenSubKey(“Software”);
    3.   [b]RegistryKey HkMine = HkSoftware.CreateSubKey(“Phan mem cua toi”);[/b]

    Như thế là chúng ta đã có có khóa mang tên “Phan mem cua toi” trong HKEY_LOCAL_MACHINE\Software rồi đấy.

    Điều thông thường xảy ra là ứng dụng của bạn cần bảo đảm là 1 vài dữ liệu hiện diện trong Registry – nói cách khác là tạo ra những key mang ý nghĩa nếu chúng chưa hiện diện, nhưng không làm gì cả nếu chúng hiện diện. CreateSubkey() đáp ứng đúng nhu cầu này.
    Một khi bạn đã có Registry key, bạn muốn đọc hoặc thay đổi, bạn có thể sử dụng hàm SetValue() hoặc GetValue() để đặt thuộc đi lấy dữ liệu trên Key. Thí dụ:
    Visual C# Code:
    1.   RegistryKey HkMine = HkSoftware.CreateSubkey(“Phan mem cua toi”);
    2.   HkMine.SetValue(“Ma so dang ky”, “Hello World”);
    3.   HkMine.SetValue(“So hieu”, 33);

    Đoạn mã trên sẽ đặt key về 2 giá trị: “Ma so dang ky” sẽ mang kiểu dữ liệu REG_SZ, trong khi “So hieu” sẽ mang kiểu dữ liệu REG_DWORD (ở đây giá trị của nó = 33)

    RegistryKey.GetValue() hoạt động cũng như vậy, nó được định nghĩa trả về 1 quy chiếu đối tượng, nghĩa là trả về 1 qui chiếu string nếu nó thấy có kiểu dữ liệu REG_SZ và một int nếu phát hiện kiểu dữ liệu REG_DWORD:
    Visual C# Code:
    1.   string StringValue = (string) HkMine.GetValue(“Ma so dang ky”);
    2.   int sohieu = (int) HkMine.GetValue(“So hieu”);

    Khi đã thao tác xong với registry, bạn nhớ là phải cho đóng lại nhé:
    Visual C# Code:
    1.   HkMine.Close();

    Bây giờ, tớ vừa nghĩ ra một ứng dụng nho nhỏ, chúng ta thử xây dựng 1 ứng dụng Windows Forms, trong đó có chứa 1 button để save trạng thái của Form chính, trong đó Form chính còn chứa thêm các thuộc tính như màu sắc, font chữ,… Chẳng hạn nhé, bây giờ mình có 1 chương trình, người dùng mở lên, thao tác “tá lả âm binh” trên đó như thay đổi màu sắc phông chữ, thay đổi màu nền,… sau đó họ thoát ra, và bạn phải làm sao để lúc họ mở lại, những thay đổi của người dùng không bị biến mất. Làm sao đây? A ha, đây là lúc chúng ta sử dụng đến đàn em “RegistryKey” vừa quen biết.

    Giả sử,tớ đã xây dựng Form xong rồi nhé, và có đầy đủ các thuộc tính, mọi người ơi, phá Form tớ thoải mái đi, yeah, ok. Xong! Bây giờ tớ dùng Registry.SetValue() để lưu lại mấy cái phá hoại của mấy người (hix)
    Visual C# Code:
    1.   private void FileSave_Cliked(object sender, EventArgs e) // tình huống clicked của button Saved
    2.   {
    3.               RegistryKey regKey = Registry.CurrentUser;
    4.               regKey = regKey.CreateSubkey(“Software\\C#\\UngDung”);
    5.               regKey.SetValue(“CurrSize”,currFontSize);
    6.               regKey.SetValue(“CurrColor”,currColor.Name);  
    7.   }

    Nếu bây giờ người sử dụng cho màu hiện hành về màu Blue đi nhá và kích thước Font chữ là 30. Thì những thông tin này sẽ được lưu trong HKEY_CURRENT_USER\Software\C#\UngDung

    Phù,xong phần lưu thông tin, bây giờ giải quyết việc đọc thông tin đã lưu bằng cách dùng hàm GetValue(). Cụ thể như đoạn code dưới đây:

    Visual C# Code:
    1.   RegistryKey regKey = Registry.CurrentUser;
    2.   regKey = regKey.CreateSubkey(“Software\\C#\\UngDung”);
    3.   //đọc vào dữ liệu rồi gán cho biến tình trạng
    4.   currFontSize = (int) regKey.GetValue(“CurrSize”,currFontSize);
    5.   string c = (string) regKey.GetValue(“CurrColor”,currColor.Name);
    6.   currColor = Color.FromName( c );
    7.   BackColor = currColor;

  2. #2
    Ngày gia nhập
    06 2007
    Bài viết
    182

    Rất hay và bổ ích, nhưng mà viết thêm về mấy cái khác như việc đăng ký một chương trình được chạy hay ko ở trong win được ko

  3. #3
    Ngày gia nhập
    12 2010
    Bài viết
    683

    Trích dẫn Nguyên bản được gửi bởi neverland87 Xem bài viết
    Phù,xong phần lưu thông tin, bây giờ giải quyết việc đọc thông tin đã lưu bằng cách dùng hàm GetValue(). Cụ thể như đoạn code dưới đây:

    Visual C# Code:
    1.   RegistryKey regKey = Registry.CurrentUser;
    2.   regKey = regKey.CreateSubkey(“Software\\C#\\UngDung”);
    3.   //đọc vào dữ liệu rồi gán cho biến tình trạng
    4.   currFontSize = (int) regKey.GetValue(“CurrSize”,currFontSize);
    5.   string c = (string) regKey.GetValue(“CurrColor”,currColor.Name);
    6.   currColor = Color.FromName( c );
    7.   BackColor = currColor;
    Mọi việc sẽ rất đơn giản khi em lấy dc value data của InstalledInstances hện tại có value data là "SQLEXPRESS"

    nằm trong Key_Local_Machine\Software\Microsoft\Microsoft SQL Server

    Vậy a có thể chỉ cho e cách lấy Value data của nó bằng C#!!! Tức là lấy string "SQLEXPRESS" ra đó a??

    Các tài liệu về registry ko có phần lấy value data --> chỉ có lấy name của keys thôi

  4. #4
    Ngày gia nhập
    11 2008
    Nơi ở
    An Giang
    Bài viết
    502

    Trường hợp máy user chỉ có 1 InstanseName thui thì ta code thế này:
    Visual C# Code:
    1. string serverName = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Microsoft SQL Server").GetValue("InstalledInstances").ToString();
    2.  MessageBox.Show(serverName);
    Trường hợp user có từ 2 InstanseName trở lên thì gán cho nó vào mảng rùi duyệt show ra từng ServerName cho user chọn.
    Visual C# Code:
    1. string [] serverNames = (string [])Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Microsoft SQL Server").GetValue("InstalledInstances");
    2.             foreach (string serverName in serverNames)
    3.                 MessageBox.Show(serverName);

  5. #5
    Ngày gia nhập
    12 2010
    Bài viết
    683

    Trích dẫn Nguyên bản được gửi bởi huuhung Xem bài viết
    Trường hợp máy user chỉ có 1 InstanseName thui thì ta code thế này:
    Visual C# Code:
    1. string serverName = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Microsoft SQL Server").GetValue("InstalledInstances").ToString();
    2.  MessageBox.Show(serverName);
    Thanks bác hùng rất nhiều nhưng out put cái trên là System.String[]???
    Đã được chỉnh sửa lần cuối bởi cchangkhongayngo : 14-09-2011 lúc 10:43 PM.

  6. #6
    Ngày gia nhập
    12 2010
    Nơi ở
    Cần thơ
    Bài viết
    273

    Mặc định Tương tác với system registry trong lập trình c#

    Tớ có 1 vấn đề không tìm được câu trả lời...làm sao mình đọc và ghi giá trị default ?
    Set value không làm được...ai biết giúp tớ với...cảm ơn nhiều!
    Ai bất tài, tôi nhìn hoài chẳng thấy,
    Đi khắp phòng tôi lấy 1 tấm gương,
    Khẽ đặt lên một góc phía bức tường,
    Nhìn vào đó, tôi tận tường kẻ đó.

  7. #7
    Ngày gia nhập
    11 2008
    Nơi ở
    An Giang
    Bài viết
    502

    Trích dẫn Nguyên bản được gửi bởi azurelonely Xem bài viết
    Tớ có 1 vấn đề không tìm được câu trả lời...làm sao mình đọc và ghi giá trị default ?
    Set value không làm được...ai biết giúp tớ với...cảm ơn nhiều!
    Set Value cho giá trị Default thì bạn chỉ cần SetValue(null,"giá trị");

  8. #8
    Ngày gia nhập
    12 2010
    Bài viết
    683

    Bạn tìm những trang web nước ngoài ấy, hình như là khi tìm hiểu cái vấn đề của mình ở trên thì mình thấy có đó... tìm với keywork là: How to ... nó sẽ ra thôi...

    Chúc vui vẻ

  9. #9
    Ngày gia nhập
    12 2010
    Nơi ở
    Cần thơ
    Bài viết
    273

    Trích dẫn Nguyên bản được gửi bởi huuhung Xem bài viết
    Set Value cho giá trị Default thì bạn chỉ cần SetValue(null,"giá trị");
    Trích dẫn Nguyên bản được gửi bởi cchangkhongayngo Xem bài viết
    Bạn tìm những trang web nước ngoài ấy, hình như là khi tìm hiểu cái vấn đề của mình ở trên thì mình thấy có đó... tìm với keywork là: How to ... nó sẽ ra thôi...

    Chúc vui vẻ
    Vâng...cảm ơn 2 bạn nhiều...để mình thử
    Ai bất tài, tôi nhìn hoài chẳng thấy,
    Đi khắp phòng tôi lấy 1 tấm gương,
    Khẽ đặt lên một góc phía bức tường,
    Nhìn vào đó, tôi tận tường kẻ đó.

  10. #10
    Ngày gia nhập
    05 2011
    Nơi ở
    Lang thang NET
    Bài viết
    3

    Mấy pro cho mình hỏi: Lỗi: "Requested registry access is not allowed." khi sử dụng RegistryKey...là bị gì z!
    Cụ thể mình cần tạo ra một key: yy bên trong thư mục software, nhưng ngay từ khi chạy dòng đầu tiên là nó đã bị lỗi!
    Lỗi xảy ra ngay dòng này!
    RegistryKey HkSoftware = Hklm.OpenSubKey(“Software”);

Các đề tài tương tự

  1. Phân biệt System.out.print, System.out.println...trong Java
    Gửi bởi thaihoai trong diễn đàn Nhập môn lập trình Java
    Trả lời: 1
    Bài viết cuối: 10-09-2012, 09:41 PM
  2. Database tìm ngày trong database lỗi: Cannot perform 'Like' operation on System.DateTime and System.String
    Gửi bởi vudat0987 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 7
    Bài viết cuối: 26-06-2012, 02:16 PM
  3. Registry CleanUP 5 Suite 5.0.1.0(dọn dẹp registry để máy chạy nhanh hơn)
    Gửi bởi gioyeumay123 trong diễn đàn Software (Phần mềm) | Ebooks
    Trả lời: 0
    Bài viết cuối: 03-04-2012, 04:18 PM
  4. Registry Winner 6.4.10.12 | Sửa chữa lỗi Registry và tối ưu tốc độ
    Gửi bởi chjentha11 trong diễn đàn Software (Phần mềm) | Ebooks
    Trả lời: 0
    Bài viết cuối: 20-12-2011, 03:01 PM
  5. Viết registry value vào Registry bằng C#
    Gửi bởi ncandy trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 28-03-2011, 11:20 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn