Jak vytvořit doplňku (XLL) pro Excel použití Visual C++

Překlady článku Překlady článku
ID článku: 178474 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

XLL je doplněk pro aplikaci Microsoft Excel můžete sestavit s kompilátorem podporující vytváření dll (dynamických knihovnách). Tento článek je určen získat spuštěna vytváření XLL s Microsoft Visual C++. Chcete-li postupujte podle pokynů v tomto článku, měli byste mít některé zkušenosti vytváření dll a Microsoft Excel 97 Developer's Kit obsahuje nezbytné záhlaví a soubory knihovny k sestavení XLL by měl mít.

Další informace

Kroky vytvoření XLL

  1. Vytvoření nového projektu AppWizard MFC (DLL) nazývá Anewxll.
  2. Kopírovat Xlcall.h, Framewrk.h, Framewrk.c a Xlcall32.lib z Microsoft Excel 97 Developer's Kit adresáři projektu.
  3. Přejmenovat Framewrk.c Framewrk.cpp.
  4. Přidat Framewrk.cpp zdrojové soubory projektu.
  5. Přidejte následující řádek horní Framewrk.cpp vyhnout se chybám kompilátoru o předkompilované záhlaví # include:
    
          #include "stdafx.h"
    					
  6. Změnit následující řádek v Framewrk.cpp:
          #include "..\..\include\xlcall.h"
    					
    k:
          #include "xlcall.h"
    					
  7. V nabídce Projekt klepněte na tlačítko nastavení. Klepněte na kartu spojení a přidejte Xlcall32.lib pole upravit objekt/knihovna modulů.
  8. Přidejte následující # include příkazy horní Anewxll.cpp:
          #include "xlcall.h"
          #include "framewrk.h"
    					
    Poznámka: projektu je nyní nastavení odpovídajícím způsobem a by měl kompilovat, však není přidané XLL podporu ještě. Zbývající kroky poskytnout některé ukázkový kód můžete přidat XLL získat spuštěna.

  9. Připojit následující kód Anewxll.cpp: ukázkový 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. Přidejte následující řádky na konec souboru Anewxll.def:
          xlAutoOpen
          xlAutoClose
          xlAddInManagerInfo
          MyMotd
          MyFunc
    					
  11. Nyní můžete kompilovat projektu k výrobě DLL nazývá Anewxll.dll. Jakmile kompilován DLL Přejmenujte Anewxll.xll.

Použití doplňku s aplikací Microsoft Excel

  1. Spusťte nový sešit v aplikaci Microsoft Excel.
  2. V nabídce Nástroje klepněte na položku doplňky. Procházet Anewxll.xll přidat a klepněte na tlačítko OK. Všimněte si, že po klepnutí na tlačítko OK v dialogovém okně Doplňky funkce xlAutoOpen spouští.
  3. Klepněte v nabídce MyMenu M.O.T.D. Po klepnutí na položku nabídky zobrazíte MessageBox s nabídkou, jako například "Rebekah říká ' Apple denně, udržuje lékaře pryč!'" spustí funkci MyMotd.
  4. Přidat do buňky následující vzorec:
    =MYFUNC(2,6)
    					
    MYFUNC vrátí hodnotu 12, produkt 2 a 6.

  5. V nabídce Nástroje klepněte na položku doplňky. Zrušte zaškrtnutí políčka doplňku a klepněte na tlačítko OK. Všimněte si, že po klepnutí na tlačítko OK v dialogovém okně Doplňky funkce xlAutoClose spouští.

Další poznámky

Pokud používáte aplikaci Microsoft Visual C++ 6.0 v předchozím příkladu selže při kompilaci v režimu ladění. Jako aplikace Visual C++ 6.0 řetězec literály jsou umístěny v přečíst pouze paměti ladění sestaví a zdvih, vývojáři XLL použít délku předpony jejich řetězců způsobuje narušení přístupu dochází k selhání. Jako práce kolem odebrat přepínače kompilátor /ZI nastavení projektu nebo pouze zkušební verzi sestavení. Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
198477PRB: Použití /ZI způsobuje porušení

Odkazy

Další informace týkající se XLL naleznete:
Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)

Vlastnosti

ID článku: 178474 - Poslední aktualizace: 12. února 2007 - Revize: 4.3
Informace v tomto článku jsou určeny pro produkt:
  • 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
Klíčová slova: 
kbmt kbhowto KB178474 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:178474

Dejte nám zpětnou vazbu

 

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