Ako Vybuduj doplnok (XLL) pre program Excel pomocou Visual c ++

Preklady článku Preklady článku
ID článku: 178474 - Zobraziť produkty, ktorých sa tento článok týka.
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

SUHRN

XLL je doplnok pre program Microsoft Excel, ktoré môže stavať s akoukoľvek kompilátor, ktorý podporuje budovanie DLL (dynamická knižníc). Tento článok je určený k vám začala výstavba XLL s Microsoft Visual C++. Vykonaná akcia postupujte podľa krokov uvedených v tomto článku, mali by ste mať nejaké skúsenosti budovanie dll a ste mali mať Microsoft Excel 97 Developer's Kit, ktorý obsahuje potrebné hlavičky a knižnice súbory vybudovať XLL.

DALSIE INFORMACIE

Postup vytvorenia XLL

  1. Vytvoriť nový projekt MFC AppWizard (.dll) nazýva Anewxll.
  2. Kopírovať Xlcall.h, Framewrk.h, Framewrk.c a Xlcall32.lib z Microsoft Excel 97 Developer's Kit do vášho adresára projektu.
  3. Premenujte Framewrk.c na Framewrk.cpp.
  4. Pridať Framewrk.cpp zdrojové súbory vášho projektu.
  5. Pridať nasledujúce # obsahovať riadok do hornej časti Framewrk.cpp sa predišlo kompilátor chyby o predkompilovaných hlavičky:
    
          #include "stdafx.h"
    					
  6. Zmena nasledujúci riadok v Framewrk.cpp:
          #include "..\..\include\xlcall.h"
    					
    na:
          #include "xlcall.h"
    					
  7. V ponuke projekt kliknite na tlačidlo Nastavenie. Kliknite na kartu odkaz a pridať Xlcall32.lib knižnicu objektov modulov editovacieho poľa.
  8. Pridať nasledujúce # obsahovať výkazy na začiatok Anewxll.cpp:
          #include "xlcall.h"
          #include "framewrk.h"
    					
    Poznámka: Projektu je teraz nastavenie vhodne a mali zostaviť Avšak nepridali ste XLL podporu ešte. Zostávajúce kroky dať niektoré vzorového kódu môžete pridať k XLL vám začal.

  9. Pripojiť nasledujúci kód do Anewxll.cpp: Vzorky kód -----------
          //================================================================
          // 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. Pridajte nasledujúce riadky na koniec súboru Anewxll.def:
          xlAutoOpen
          xlAutoClose
          xlAddInManagerInfo
          MyMotd
          MyFunc
    					
  11. Teraz si môžete zostaviť svoj projekt na výrobu DLL nazýva Anewxll.dll. Akonáhle je zostavené DLL, premenujte na Anewxll.xll.

Pomocou programu Microsoft Excel doplnok

  1. Začať nový zošit v programe Microsoft Excel.
  2. V ponuke Nástroje kliknite na položku doplnky. Prejdite na položku Pridať Anewxll.xll a kliknite na tlačidlo OK. Všimnite si, že po kliknutí na tlačidlo OK v dialógovom okne doplnky, xlAutoOpen Funkcia sa spustí.
  3. MyMenu ponuke kliknite na položku M.O.T.D. Po kliknutí položka ponuky funkciu MyMotd beží na zobrazenie Okno s hlásením s citátom, ako "Rebeka hovorí" jablko denne, udržiava lekár preč! "".
  4. V bunke, pridajte nasledujúci vzorec:
    =MYFUNC(2,6)
    					
    MYFUNC vráti 12, súčin 2 a 6.

  5. V ponuke Nástroje kliknite na položku doplnky. Zrušte začiarknutie políčka doplnok a kliknite na tlačidlo ok. Všimnite si, že po kliknutí na tlačidlo OK v dialógom okne doplnky, xlAutoClose Funkcia sa spustí.

Dodatočné poznámky

Ak používate program Microsoft Visual c ++ 6.0, predchádzajúci príklad zlyhá keď ste zostaviť ju v Debug režime. Chyba sa vyskytuje, pretože z Visual C ++ 6.0, reťazec literály sú umiestnené v čítať iba pamäte v debug stavia a trik, že XLL vývojári použiť prefix dĺžky ich reťazce spôsobuje narušenie prístupu. Ako obísť, môžete odstrániť /ZI kompilátor prepínač v nastavení projektu alebo len testu uvoľnenie stavať. Pre viac informácií pozri článok v databáze Microsoft Knowledge Base:
198477 PRB: Použitie /ZI môže spôsobiť porušenie prístupu

ODKAZY

Ďalšie informácie týkajúce sa XLL nájdete:
Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)

Vlastnosti

ID článku: 178474 - Posledná kontrola: 18. októbra 2011 - Revízia: 2.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
Kľúčové slová: 
kbhowto kbmt KB178474 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:178474

Odošlite odozvu

 

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