Word có chức năng bổ trợ bị vô hiệu hóa (Trợ giúp | Giới thiệu | Các mục bị vô hiệu hóa).
Làm cách nào để thêm bổ trợ vào danh sách bị vô hiệu hóa mà không phải gặp sự cố bổ trợ và chờ lỗi xuất hiện?
Word có chức năng bổ trợ bị vô hiệu hóa (Trợ giúp | Giới thiệu | Các mục bị vô hiệu hóa).
Làm cách nào để thêm bổ trợ vào danh sách bị vô hiệu hóa mà không phải gặp sự cố bổ trợ và chờ lỗi xuất hiện?
Câu trả lời:
Tôi đã cố gắng tìm ra định dạng nhị phân của các giá trị trong khóa DisablesItems và bài đăng của bạn ở đây đã đưa tôi đi đúng hướng. Tuy nhiên tôi nghĩ định dạng này hơi khác so với cách bạn nhìn thấy, ít nhất là trong Office 2010.
Theo như tôi có thể nói định dạng là như thế này:
Bốn byte đầu tiên là một số nguyên 32 bit. Nó thường có giá trị 1. Tôi không chắc nó có mục đích gì.
Bốn byte tiếp theo là số nguyên 32 bit cho chúng ta biết độ dài của đường dẫn dll tính bằng byte, bao gồm ký tự kết thúc (null hoặc 0x0000).
Bốn byte tiếp theo là một số nguyên 32 bit cho chúng ta biết độ dài của tên thân thiện tính bằng byte, bao gồm ký tự kết thúc (null hoặc 0x0000).
Chuỗi byte tiếp theo là một chuỗi unicode end-endian kết thúc null có chứa đường dẫn đến dll bổ trợ. Vì một số lý do, đường dẫn này dường như chỉ chứa các ký tự chữ thường.
Chuỗi byte tiếp theo là một chuỗi unicode end-endian end-end kết thúc có chứa tên thân thiện của bổ trợ.
Tôi đã có thể vô hiệu hóa thành công bổ trợ bằng cách sử dụng mã C # sau:
string path = "<full path to add-in dll>".ToLower();
string friendlyName = "<add-in friendly name>";
MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(1); // Unknown
writer.Write((path.Length * 2) + 2); // Path length, 2 bytes per character
writer.Write((friendlyName.Length * 2) + 2); // Friendly name length
writer.Write(Encoding.Unicode.GetBytes(path)); // Path
writer.Write(Convert.ToInt16(0)); // null terminator
writer.Write(Encoding.Unicode.GetBytes(friendlyName)); // Friendly name
writer.Write(Convert.ToInt16(0)); // null terminator
writer.Close();
// Version numbers: 11.0 = Office 2003, 12.0 = Office 2007, 14.0 = Office 2010
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Office\14.0\Word\Resiliency\DisabledItems", true);
key.SetValue("63CB962", stream.ToArray(), RegistryValueKind.Binary);
key.Close();
Một cách tiếp cận tương tự có thể được sử dụng để giải mã đường dẫn dll của một giá trị hiện có như sau:
// Let 'bytes' be a byte array containing the binary registry value
BinaryReader binaryReader = new BinaryReader(new MemoryStream(bytes));
binaryReader.ReadInt32(); // Read the first four bytes and ignore
int pathLength = binaryReader.ReadInt32(); // The next four bytes are the length of the path
binaryReader.Close();
if (bytes.Length >= 12 + pathLength)
{
string path = Encoding.Unicode.GetString(bytes, 12, pathLength - 2);
}
Trả lời câu hỏi của riêng tôi.
Nó nằm trong sổ đăng ký, trong HKCU \ Software \ Microsoft \ Office [phiên bản] & gt; \ Word \ Resiliency \ DisablesItems (trong đó [phiên bản] là 10.0 cho XP, 11.0 cho 2003 và 12.0 cho 2007).
Các khóa là các khóa nhị phân có tên gồm sáu ký tự (ngẫu nhiên, theo như tôi có thể nói).
Giá trị là: 01,00,00,00, x, 00,00,00, y, [đường dẫn], 00,00, [tên], 00,00,00 x là số byte trong đường dẫn (bao gồm hai byte terminator) và y là số byte trong tên (mà "tên thân thiện"). x + y phải là tổng số byte trừ mười. x và y đều ở dạng hex. Tôi cho rằng chúng thực sự là DWORD, nhưng tôi chỉ cần LSB.
Đường dẫn được mã hóa trong UCS-2, endian nhỏ, vì vậy để đưa ra một ví dụ, "c: \" là 00,63,00,3a, 00,5c
Đúng, mã hóa nhị phân dường như là mã hóa cực kỳ xuất sắc của "Lấy chuỗi ASCII kết thúc null, dịch sang Unicode, sau đó lấy các byte của điều đó và kết thúc null
Lưu ý rằng x và y là số byte, không phải ký tự; có 2 byte cho mỗi ký tự trong UCS-2.
Nếu bạn muốn chặn một mẫu (tức là .dot chứ không phải là một), sau đó đặt 00 cho y và bỏ qua phần tử tên và chấm dứt (để nó kết thúc bằng ba byte null, không phải năm).
Theo đó Trang web MS , để tắt một bổ trợ trong word 2007, hãy làm như sau:
Lưu ý rằng mã của Eirikur chỉ hoạt động nếu có khóa con Resiliency \ DisconnectItems. Có vẻ như Word sẽ thêm / xóa toàn bộ khóa con này khi tắt / bật. Vì vậy, nếu bạn nhận được một ngoại lệ chạy mã, có lẽ bạn cần thêm khóa con trước.
(Bài đăng của tôi ở đây có lẽ nên được kiểm duyệt, nó thuộc về một nhận xét nhưng tôi không có đủ điểm! Khởi đầu tồi tệ)