2012-04-14 27 views
5

Đây là câu hỏi chủ yếu liên quan đến WinAPI RegSetValueEx. Nếu bạn nhìn vào mô tả của nó trong MSDN here bạn sẽ tìm thấy:Có cần thiết để thoát khỏi các dấu gạch chéo trong các chuỗi trong Windows Registry không?

lpData [in] Dữ liệu được lưu trữ.

REG_SZ, chuỗi phải bị hủy. Với kiểu dữ liệu REG_MULTI_SZ , chuỗi phải được kết thúc bằng hai ký tự null. A dấu gạch chéo ngược phải được đặt trước bởi dấu gạch chéo ngược khác là ký tự thoát . Ví dụ: chỉ định "C: \\ mydir \\ myfile" để lưu trữ chuỗi "C: \ mydir \ myfile".

Câu hỏi tôi có, tôi có thực sự cần phải thoát khỏi dấu gạch chéo không? Bởi vì tôi chưa bao giờ làm điều đó trước đây và nó hoạt động hoàn hảo.

+0

Thoát là dành cho C++, không phải cho phương thức. Vì vậy, ví dụ: nếu bạn định đưa người dùng nhập vào dòng lệnh, bạn sẽ không cần phải biến đổi văn bản thành có \\ cho tất cả \. Nếu, tuy nhiên, bạn sẽ sử dụng một chuỗi chữ trong mã, như "C: \ ...", bạn sẽ cần nguồn C++ của bạn để có "C: \\ ...". Tôi giả định rằng đây là những gì các tài liệu đang nói về. Có một cơ hội trang có nghĩa là bạn sẽ thực sự cần phải làm "C: \\\\ ..." (trong trường hợp đó bạn có thể phải chuyển đổi đầu vào của người dùng) – Corbin

+0

@Corbin :) Vâng, điều đó tạo nên sự khác biệt lớn. Nó rất khó hiểu làm thế nào họ đặt nó trong tài liệu. – ahmd0

+0

+1 câu hỏi hay, tài liệu này thực sự kỳ lạ –

Trả lời

8

Đây thực sự là lỗi tài liệu. Bạn không cần phải thoát khỏi các dấu gạch chéo ngược ở đây. Chuỗi chính xác mà bạn gửi đến API này là những gì sẽ được lưu trữ trong sổ đăng ký. Không xử lý các dấu gạch chéo ngược sẽ được thực hiện.

Bây giờ, đúng là trong C và C++ bạn cần phải thoát khỏi các ký tự nhất định trong chuỗi ký tự, nhưng điều đó không phù hợp với tài liệu API Win32. Đó là một vấn đề đối với mã nguồn để dịch mã đối tượng cho các ngôn ngữ cụ thể và hoàn toàn vượt ra ngoài việc nộp tài liệu này.

+0

Thật vậy. Phần quan trọng là thoát các ký tự dấu gạch chéo ngược trong * chuỗi ký tự *. –

2

Có, bởi vì \ có ý nghĩa trong C++, trong khi \\ có nghĩa là dấu gạch chéo ngược thông thường.

Khi \ xuất hiện trong chuỗi, trình biên dịch C++ sẽ xem ký tự tiếp theo và chuyển đổi kết hợp thành thứ gì đó (ví dụ: \n sẽ được chuyển thành ký tự "dòng mới"). \\ sẽ được chuyển thành dấu gạch chéo ngược thông thường. Điều này được gọi là "thoát" (trong lịch sử, trên các thiết bị đầu cuối cũ, tổ hợp phím ESC + được sử dụng cho nhiều khóa không nằm trên bàn phím).

+0

Đây không phải là C++. Tôi đang nói về giá trị được chuyển đến RegSetValueEx API. – ahmd0

+0

@ ahmd0 Bạn đã gắn thẻ câu hỏi của mình với C++. Bạn đang sử dụng ngôn ngữ nào? – littleadv

+2

Có, C++. Và tất nhiên tôi biết rằng một trong những nhu cầu để thoát khỏi những thứ với một dấu gạch chéo trong C. Họ đặt nó vào một mô tả cho một API Windows mặc dù không có liên quan đến C + + hoặc bất kỳ ngôn ngữ khác. Một lần nữa, tôi muốn biết nếu MS muốn chúng ta thoát khỏi chuỗi được chuyển đến các API đăng ký. – ahmd0

Các vấn đề liên quan