Come creare un componente aggiuntivo (XLL) per Excel utilizzando Visual c ++

Traduzione articoli Traduzione articoli
Identificativo articolo: 178474 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Una libreria XLL Ŕ un componente aggiuntivo per Microsoft Excel Ŕ possibile creare con qualsiasi compilatore che supporta la generazione di DLL (librerie a collegamento dinamico). In questo articolo Ŕ progettato per iniziare la creazione di librerie XLL con Microsoft Visual c ++. Per attenersi alla procedura descritta in questo articolo, Ŕ necessario familiaritÓ durante la generazione di DLL e si deve avere il Kit del Microsoft Excel 97 Developer, che contiene l'intestazione necessari e il file di libreria per generare una libreria XLL.

Informazioni

Procedura per creare una libreria XLL

  1. Creare un nuovo progetto MFC AppWizard (DLL) denominato Anewxll.
  2. ╚ possibile copiare il xlcall.h, Framewrk.h, Framewrk.c e Xlcall32.lib da Kit del Microsoft Excel 97 Developer alla directory del progetto.
  3. Rinominare Framewrk.c Framewrk.cpp.
  4. Aggiungere Framewrk.cpp i file di origine del progetto.
  5. Aggiungere quanto segue # include la riga all'inizio di Framewrk.cpp per evitare errori del compilatore sulle intestazioni precompilate:
    
          #include "stdafx.h"
    					
  6. Modificare la riga seguente in Framewrk.cpp:
          #include "..\..\include\xlcall.h"
    					
    per:
          #include "xlcall.h"
    					
  7. Scegliere Impostazioni dal menu progetto. Scegliere la scheda collegamento e aggiungere Xlcall32.lib casella di modifica moduli di libreria di oggetti.
  8. Aggiungere le seguenti istruzioni nella parte superiore della Anewxll.cpp # include:
          #include "xlcall.h"
          #include "framewrk.h"
    					
    Nota: il progetto verrÓ ora installazione in modo appropriato e deve compilare, tuttavia, non Ŕ aggiunto supporto XLL ancora. I passaggi rimanenti forniscono alcuni esempi di codice che Ŕ possibile aggiungere la libreria XLL per iniziare.

  9. Aggiunge il seguente codice per Anewxll.cpp: codice di esempio-----------
          //================================================================
          // 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. Aggiungere le seguenti righe alla fine del file Anewxll.def:
          xlAutoOpen
          xlAutoClose
          xlAddInManagerInfo
          MyMotd
          MyFunc
    					
  11. ╚ ora possibile compilare il progetto per generare una DLL denominata Anewxll.dll. Una volta compilata la DLL, rinominarlo Anewxll.xll.

Utilizzo del componente aggiuntivo con Microsoft Excel

  1. Avviare una nuova cartella di lavoro in Microsoft Excel.
  2. Scegliere componenti aggiuntivi dal menu Strumenti. Individuare aggiungere Anewxll.xll e scegliere OK. Si noti che quando si fa clic su OK nella finestra di dialogo, i componenti aggiuntivi, viene eseguita la funzione xlAutoOpen.
  3. Scegliere M.O.T.D dal menu MyMenu. Quando si fa clic la voce di menu, viene eseguita la funzione di MyMotd per visualizzare un MessageBox contenente una citazione, ad esempio "Rebekah dice 'Un Apple giorno, mantiene il dottore stoccaggio!'".
  4. Nella finestra di una cella, aggiungere la seguente formula:
    =MYFUNC(2,6)
    					
    MYFUNC restituisce 12, il prodotto di 2 e 6.

  5. Scegliere componenti aggiuntivi dal menu Strumenti. Deselezionare la casella di controllo aggiuntivo e scegliere OK. Si noti che quando si sceglie OK nella finestra di dialogo, i componenti aggiuntivi, viene eseguita la funzione xlAutoClose.

Note aggiuntive

Se si utilizza Microsoft Visual c ++ 6.0, l'esempio precedente non produrrÓ alcun risultato durante la compilazione in modalitÓ di debug. L'errore si verifica perchÚ di Visual c ++ 6.0, stringa vengono inseriti i valori letterali in lettura memoria solo in debug build e la mano che gli sviluppatori di librerie XLL utilizzano per prefisso di lunghezza le relative stringhe causa una violazione di accesso. Come un lavoro risolvere, Ŕ possibile rimuovere l'opzione del compilatore /Zi le impostazioni del progetto o verificare semplicemente una build di rilascio. Per ulteriori informazioni, vedere il seguente articolo della Microsoft Knowledge Base riportato di seguito:
198477PRB: Utilizzo di /Zi pu˛ causare una violazione di accesso

Riferimenti

Per ulteriori informazioni relative alle librerie XLL, vedere:
Kit dello sviluppatore di Microsoft Excel 97 (ISBN: 1-57231-498-2)

ProprietÓ

Identificativo articolo: 178474 - Ultima modifica: lunedý 12 febbraio 2007 - Revisione: 4.3
Le informazioni in questo articolo si applicano 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
Chiavi:á
kbmt kbhowto KB178474 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 178474
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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