Compatibilidade com versões anteriores
Aplica-se a: Excel 2013 | Office 2013 | Visual Studio
Este tópico aborda os problemas de compatibilidade XLL em diferentes versões do Microsoft Excel.
Definições de constantes úteis
Considere incluir definições semelhantes a esses elementos no seu código do project XLL e substituir todas as instâncias de números literais usadas neste contexto. Isso irá esclarecer o código específicos da versão e reduzir a probabilidade de bugs relacionados à versão no formulário de números de aparência inofensiva.
#define MAX_XL11_ROWS 65536
#define MAX_XL11_COLS 256
#define MAX_XL12_ROWS 1048576
#define MAX_XL12_COLS 16384
#define MAX_XL11_UDF_ARGS 30
#define MAX_XL12_UDF_ARGS 255
#define MAX_XL4_STR_LEN 255u
#define MAX_XL12_STR_LEN 32767u
Obter a versão em execução
Você deve detectar qual versão está em execução usando Excel4(xlfGetWorkspace, &version, 1, &arg)
, em arg
que é um XLOPER numérico definido como 2 e a versão é uma XLOPER de cadeia de caracteres que pode ser coagida a um inteiro. Para o Microsoft Excel 2013, ele é 15.0. Fazer isso em ou a partir da função, xlAutoOpen. Em seguida, você pode definir uma variável global que informe todos os módulos do seu projeto em que a versão do Excel está em execução. O código pode decidir se vai acionar usando a API C Excel12 e XLOPER12s ou usando Excel4 usando XLOPERs.
Você pode acionar XLCallVer para descobrir a versão API C, mas isso não indica qual das versões anteriores do Excel 2007 você está executando.
Criar suplementos que exportam interfaces duplas
Considere uma função XLL que leva de uma cadeia de caracteres e retorna um valor que pode ser qualquer um dos tipos de dados de planilha. Você pode exportar uma função registrada como tipo PD e com o protótipo a seguir, onde a cadeia é passada como uma cadeia de comprimento contados em bytes.
LPXLOPER WINAPI my_xll_fn(unsigned char *arg);
Embora isso funcione muito bem, há vários motivos para que ela não seja a interface ideal para o código a partir do Excel 2007:
- Ele está sujeito às limitações de cadeias de caracteres de bytes C API e não é possível acessar as longas cadeias de caracteres Unicode com suporte a partir do Excel 2007.
- No entanto, a partir do Excel 2007, o Excel pode passar e aceitar o XLOPERs. Internamente ele os converte para XLOPER12s. Portanto, há uma conversão implícita de sobrecarga a partir do Excel 2007 que não estará lá quando o código for executado em versões anteriores do Excel.
- Pode ser que essa função possa tornar o thread seguro, mas se a cadeia de caracteres de tipo for alterada para
PD$
, o registro falhará na partida antes do Excel 2007.
Por esses motivos, idealmente, a partir do Excel 2007, você deve exportar uma função para seus usuários que foi registrada como QD%$
, supondo que seu código seja thread seguro e protótipo da seguinte maneira.
LPXLOPER12 WINAPI my_xll_fn_v12(wchar_t *arg);
Outro motivo, para que você querer registrar uma função diferente a partir do Excel 2007 é o fato das funções XLL permitir acima de 255 argumentos, em vez do limite de 30 das versões anteriores.
Felizmente, você pode ter os benefícios de ambos ao exportar as duas versões do seu projeto. Você pode detectar a versão do Excel em execução e inscrever condicionalmente a função mais apropriada. Para mais informações e para um exemplo de implementação, confira desenvolvendo suplementos (XLLs) no Excel 2007.
Essa abordagem traz a possibilidade de uma planilha em execução no Excel 2003 poder exibir resultados diferentes do que a execução da mesma planilha a partir do Excel 2007. Por exemplo, o Excel 2003 mapearia uma cadeia Unicode em uma célula de planilha do Excel 2003 para uma cadeia de bytes ASCII e truncaria antes de passar para uma função XLL. A partir do Excel 2007, o Excel passará uma cadeia Unicode não convertida para uma função XLL registrada da maneira certa. Isso pode levar a um resultado diferente. Você deve estar ciente dessa possibilidade e das consequências aos seus usuários, não apenas na atualização. Por exemplo, algumas funções internas numéricas foram aprimoradas entre o Excel 2003 e o Excel 2000.
Novas funções de planilha e funções de análise
Funções de análise de ferramentas (ATP) fazem parte do Excel a partir do Excel 2007. Anteriormente, um XLL apenas poderia acionar uma função ATP usando xlUDF. A partir do Excel 2007, funções ATP devem ser acionadas usando enumerações de função estipuladas em xlcall. h. O exemplo em Chamar funções definidas pelo usuário a partir de DLLs demonstra dois métodos diferentes.