Como criar um suplemento (XLL) para o Excel utilizando o Visual C++

Traduções de Artigos Traduções de Artigos
Artigo: 178474 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Um XLL é um suplemento para o Microsoft Excel pode criar com qualquer compilador que suporta a criação de dll (bibliotecas de ligação dinâmica). Este artigo foi concebido para começar a criar XLLs com o Microsoft Visual C++. Para seguir os passos descritos neste artigo, deverá ter alguma experiência criar DLLs e deveria ter Kit o Microsoft Excel 97 Developers, que contém o cabeçalho necessário e ficheiros de biblioteca para criar um XLL.

Mais Informação

Passos para criar um XLL

  1. Crie um novo projecto de MFC AppWizard (.dll) chamado Anewxll.
  2. Copie o Xlcall.h, Framewrk.h, Framewrk.c e Xlcall32.lib a partir Kit do Microsoft Excel 97 Developers para o directório do projecto.
  3. Mude o nome Framewrk.c para Framewrk.cpp.
  4. Adicione Framewrk.cpp os ficheiros de origem do projecto.
  5. Adicione o seguinte # include linha para a parte superior da Framewrk.cpp para evitar erros do compilador sobre cabeçalhos pré-compilados:
    
          #include "stdafx.h"
    					
  6. Altere a seguinte linha Framewrk.cpp:
          #include "..\..\include\xlcall.h"
    					
    para:
          #include "xlcall.h"
    					
  7. Clique em ' Definições ' no menu Project. Clique no separador ligação e adicionar Xlcall32.lib à caixa de edição de módulos de objectos/biblioteca.
  8. Adicione o seguinte # include instruções para a parte superior da Anewxll.cpp:
          #include "xlcall.h"
          #include "framewrk.h"
    					
    Nota: O projecto está agora configurada correctamente e deverá compilar, no entanto, não adicionou XLL suporte ainda. Os restantes passos fornecem algum código de exemplo, que pode adicionar XLL para começar.

  9. Acrescentar o código seguinte Anewxll.cpp: códigos de exemplo-----------
          //================================================================
          // Commonly used global variables
          int err;
          char buf[8192];
          char txt[8192];
    
          // Function registering table
          int nFuncs;
    
          // proc, type_text, function_text, arg, macro_type, category,
          // shortcut_text, help_topic, function_help
          static LPSTR func[][9] = {
          {" MyFunc", " JJJ", " MyFunc", " ", " 1", " MyCat", " ", " ", " "},
          {" MyMotd", " I", " MyMotd", " ", " 1", " MyCat", " ", " ", " "},
          {0,0,0,0, 0, 0, 0}
          };
    
          // Menu table
          int nMenuItems;
    
          static LPSTR menu[][5] = {
          {" &MyMenu", " ", " ", " Joe's Xll menu!!!", " "},
          {" M.O.T.D."," MyMotd", " ", " Message of the Day!", " "},
          {0, 0, 0, 0, 0}
          };
    
          // Initialization routine
          BOOL __stdcall xlAutoOpen(void) {
             AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
    
             // DEBUG output to indicate when called
             AfxMessageBox("xlAutoOpen() called!", MB_SETFOREGROUND);
    
             int i, j;
    
             // Get XLL file name
             static XLOPER xDll;
             Excel(xlGetName, &xDll, 0);
    
             // Prefix strengths with their length & count items
             // Note the framework's TempStr() function prefixes the
             // lengths anyway, but this is for other code that might
             // use the arrays
             for(nFuncs=0;     func[nFuncs][0];     nFuncs++) {
                 for(i=0; i<9; i++) {
                     func[nFuncs][i][0]     = (BYTE) strlen(func[nFuncs][i]+1);
                 }
    
             }
    
             for(nMenuItems=0; menu[nMenuItems][0]; nMenuItems++) {
                 for(i=0; i<5; i++) {
                 menu[nMenuItems][i][0] = (BYTE) strlen(menu[nMenuItems][i]+1);
                 }
             }
    
             // Loop through the function list, and register the functions
             for(i=0; i<nFuncs; i++) {
    
                // Register a function
                err = Excel(xlfRegister, 0, 9, (LPXLOPER)&xDll,
                   (LPXLOPER)TempStr(func[i][0]),
                   (LPXLOPER)TempStr(func[i][1]),
                   (LPXLOPER)TempStr(func[i][2]),
                   (LPXLOPER)TempStr(func[i][3]),
                   (LPXLOPER)TempStr(func[i][4]),
                   (LPXLOPER)TempStr(func[i][5]),
                   (LPXLOPER)TempStr(func[i][6]),
                   (LPXLOPER)TempStr(func[i][7]),
                   (LPXLOPER)TempStr(func[i][8])
                   );
    
                if(err != xlretSuccess) {
                 sprintf(buf, "xlfRegister for function %d, err = %d", i, err);
                 AfxMessageBox(buf, MB_SETFOREGROUND);
                }
             }
    
             // Free XLL file name from the xlGetName call made earlier
             Excel(xlFree, 0, 1, (LPXLOPER)&xDll);
    
             // Menu support section
             static XLOPER xMenu;
             static XLOPER xMenuList[10*5];
             ASSERT(nMenuItems< 10);
    
             // Build menu
             xMenu.xltype            = xltypeMulti;
             xMenu.val.array.lparray = &xMenuList[0];
             xMenu.val.array.rows    = nMenuItems;
             xMenu.val.array.columns = 5;
    
             for(i=0; i<nMenuItems; i++) {
                 for(j=0; j<5; j++) {
                     xMenuList[j+i*5].xltype  = xltypeStr;
                     xMenuList[j+i*5].val.str = menu[i][j];
                 }
             }
    
             // Add menu
            Excel(xlfAddMenu,0,3,TempNum(1),(LPXLOPER)&xMenu,TempStr(" Help"));
    
             // Finished
             return 1;
          }
    
          // Cleanup routine
          BOOL __stdcall xlAutoClose(void) {
             ::MessageBox(NULL, "xlAutoClose()", "Debug", MB_SETFOREGROUND );
    
             // Delete menu
             Excel(xlfDeleteMenu, 0, 2, TempNum(1), TempStr(" MyMenu"));
    
             return 1;
          }
    
          // Support for descriptive information about the add-in(s)
          // You can add a new customized title for the user, but
          // unfortunately, only an add-in written in Microsoft Visual Basic
          // can add a description string.
          LPXLOPER _stdcall xlAddInManagerInfo(LPXLOPER xAction) {
             static XLOPER xInfo, xIntAction;
    
             // Find out what action must be taken
             Excel(xlCoerce, &xIntAction, 2, xAction, TempInt(xltypeInt));
    
             // DEBUG output to indicate when called
             sprintf(buf, "xlAddInManagerInfo(%ld)", (long)xIntAction.val.w);
             ::MessageBox(NULL, "xlAddInManagerInfo()", "Debug",
                 MB_SETFOREGROUND );
    
             // Set title if asked
             if(xIntAction.val.w == 1) {
                 xInfo.xltype = xltypeStr;
                 xInfo.val.str = " My Add-in!!!!";
                 xInfo.val.str[0] = (char)strlen(&xInfo.val.str[1]);
             }
             else {
                 xInfo.xltype = xltypeErr;
                 xInfo.val.err = xlerrValue;
             }
    
             return (LPXLOPER)&xInfo;
          }
    
            short __stdcall MyMotd(void) {
             char *name[] = {
                "Rebekah",
                "Brent",
                "John",
                "Joseph",
                "Robert",
                "Sara",
                0
             };
             char *quote[] = {
                "An apple a day, keeps the doctor away!",
                "Carpe Diem: Seize the Day!",
                "What you dare to dream, dare to do!",
                "I think, therefore I am.",
                "A place for everything, and everything in its place.",
                "Home is where the heart is.",
    
                0
             };
    
             int nNames, nQuotes;
    
             for(nNames=0; name[nNames]; nNames++);
             for(nQuotes=0; quote[nQuotes]; nQuotes++);
    
             sprintf(buf, "%s says '%s'", name[rand()%nNames],
                quote[rand()%nQuotes]);
             ::MessageBox(NULL, buf, "XLL MOTD", MB_SETFOREGROUND );
    
             return 0;
          }
    
          // Example function that returns the product of its two parameters
          long __stdcall MyFunc(long parm1, long parm2) {
           sprintf(buf, "You sent %ld and %ld to MyFunc()!", parm1, parm2);
           ::MessageBox(NULL, buf, "MyFunc() in Anewxll!!!", MB_SETFOREGROUND);
    
           return parm1 * parm2;
          }
          //=================================================================
    					
  10. Adicionar as seguintes linhas no fim do ficheiro Anewxll.def:
          xlAutoOpen
          xlAutoClose
          xlAddInManagerInfo
          MyMotd
          MyFunc
    					
  11. Agora pode compilar o projecto para produzir uma DLL chamada Anewxll.dll. Depois da DLL é compilada, mude-o para Anewxll.xll.

Com o suplemento do Microsoft Excel

  1. Inicie um novo livro no Microsoft Excel.
  2. Clique em suplementos no menu Ferramentas. Navegue para adicionar Anewxll.xll e clique em OK. Repare que quando clica em OK na caixa de diálogo Suplementos, a função xlAutoOpen é executada.
  3. Clique em M.O.T.D no menu MyMenu. Quando o item de menu é clicado, executa a função MyMotd para apresentar um MessageBox com uma citação como "Rebekah indica 'Um Apple por dia, mantém médico fora do escritório'!".
  4. Na célula, adicione a seguinte fórmula:
    =MYFUNC(2,6)
    					
    MYFUNC devolve 12, o produto de 2 e 6.

  5. Clique em suplementos no menu Ferramentas. Desmarque a caixa de verificação suplemento e clique em OK. Repare que quando clica em OK na caixa de diálogo Suplementos, a função xlAutoClose é executada.

Notas adicionais

Se estiver a utilizar o Microsoft Visual C++ 6.0, o exemplo anterior falha quando compilar no modo de depuração. A falha ocorre porque de Visual C++ 6.0, cadeia literais são colocados na leitura cria de memória só de depuração e a vaza que os programadores XLL utilizem ao comprimento do prefixo as cadeias provoca uma violação de acesso. Como uma trabalho-volta, pode remover o parâmetro de compilador /ZI nas definições do projecto ou testar apenas uma versão de compilação. Para mais informações, consulte o seguinte artigo na base de dados de conhecimento da Microsoft:
198477PROBLEMA: A utilização do /ZI pode causar a violação de acesso

Referências

Para mais informações sobre XLLs, consulte:
Kit Microsoft Excel 97 Developers (ISBN: 1-57231-498-2)

Propriedades

Artigo: 178474 - Última revisão: 12 de fevereiro de 2007 - Revisão: 4.3
A informação contida neste artigo aplica-se a:
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palavras-chave: 
kbmt kbhowto KB178474 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 178474

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com