Como desabilito um suplemento no Word?

3

O Word possui uma função de suplementos desativados (Ajuda | Sobre | Itens desativados).

Como eu adiciono um suplemento à lista desativada sem ter que travar o add-in e esperar que o erro apareça?

    
por Richard Gadsden 03.08.2009 / 12:03

4 respostas

5

Eu estava tentando descobrir o formato binário dos valores na chave DisabledItems e o seu post aqui me colocou no caminho certo. No entanto, acho que o formato é um pouco diferente de como você o vê, pelo menos no Office 2010.

Tanto quanto eu posso dizer o formato é assim:

  • Os primeiros quatro bytes são um inteiro de 32 bits. Geralmente parece ter o valor 1. Não sei qual é o propósito dele.

  • Os próximos quatro bytes são um inteiro de 32 bits que nos informa o comprimento do caminho da dll em bytes, incluindo o caractere de terminação (nulo ou 0x0000).

  • Os próximos quatro bytes são um inteiro de 32 bits que nos informa o tamanho do nome amigável em bytes, incluindo o caractere de terminação (nulo ou 0x0000).

  • A próxima seqüência de bytes é uma cadeia unicode big endian com terminação nula contendo o caminho para a dll do suplemento. Por alguma razão, este caminho sempre parece conter apenas caracteres minúsculos.

  • A próxima seqüência de bytes é uma cadeia unicode big endian com terminação nula contendo o nome amigável do suplemento.

Eu consegui desativar com êxito um suplemento usando o seguinte código C #:

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.0\Word\Resiliency\DisabledItems", true);
key.SetValue("63CB962", stream.ToArray(), RegistryValueKind.Binary);
key.Close();

Uma abordagem semelhante pode ser usada para decodificar o caminho dll de um valor existente da seguinte forma:

// 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);
}
    
por 21.05.2010 / 19:30
2

Respondendo a minha própria pergunta.

Está no registro, em HKCU \ Software \ Microsoft \ Office [versão] > \ Word \ Resiliency \ DisabledItems (onde [versão] é 10.0 para XP, 11.0 para 2003 e 12.0 para 2007).

As chaves são chaves binárias com nomes de seis caracteres hexadecimais (tanto quanto eu posso dizer).

O valor é: 01,00,00,00, x, 00,00,00, y, [caminho], 00,00, [nome], 00,00,00 x é o número de bytes no caminho (incluindo os dois bytes terminadores) e y é o número de bytes no nome (que é um "nome amigável"). x + y deve ser o número total de bytes menos dez. x e y estão ambos em hexadecimal. Eu suponho que eles são realmente DWORDs, mas eu só precisava do LSB.

O caminho é codificado em UCS-2, little-endian, portanto, para dar um exemplo, "c: \" é 00,63,00,3a, 00,5c

Sim, a codificação binária parece ser a incrivelmente brilhante codificação de "Pegue uma string ASCII terminada com nulo, converta para Unicode, então pegue os bytes disso e nulo-termine o resultado"

Note que x e y são contagens de bytes, não caracteres; existem 2 bytes por caractere no UCS-2.

Se você quiser bloquear um modelo (ou seja, um .dot em vez de um .dll), coloque 00 para y e pule o elemento name e a terminação (para que ele termine com três bytes nulos e não cinco).

    
por 03.08.2009 / 12:14
1

De acordo com este site MS , para desativar um suplemento no Word 2007, faça o seguinte:

  1. Clique na imagem do Botão do Botão Microsoft Office, clique em Opções do Word e, em seguida, clique em Suplementos.
  2. Na caixa Suplementos, identifique o suplemento que você deseja ativar ou desativar e anote o tipo de suplemento localizado na coluna Tipo.
  3. Selecione o tipo de suplemento na caixa Gerenciar e clique em Ir.
  4. Selecione ou desmarque a caixa de seleção do Add-in que você deseja ativar ou desativar e clique em OK.
por 03.08.2009 / 12:08
1

Observe que o código do Eirikur funciona somente se a subchave Resiliency \ DisabledItems estiver em vigor. Parece que o Word irá adicionar / remover esta subchave inteira quando ela desativa / ativa. Portanto, se você obtiver uma exceção executando o código, provavelmente precisará adicionar a subchave primeiro.

(Meu post aqui provavelmente deve ser moderado, ele pertence como um comentário, mas eu não tenho pontos suficientes! Mau começo)

    
por 16.10.2010 / 06:12