Με τον τρόπο δόμησης ενός πρόσθετου (XLL) για το Excel χρησιμοποιώντας Visual C++

Αναγν. άρθρου: 178474 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Ένα XLL είναι ένα πρόσθετο για το Microsoft Excel που δημιουργείτε με οποιοδήποτε πρόγραμμα μεταγλώττισης που υποστηρίζει τη δημιουργία dll (βιβλιοθήκες δυναμικής σύνδεσης). Αυτό το άρθρο έχει σχεδιαστεί για να ξεκινήσετε τη δημιουργία xll με Microsoft Visual C++. Για να Ακολουθήστε τα βήματα που περιγράφονται σε αυτό το άρθρο, θα πρέπει να έχετε κάποια εμπειρία Δόμηση dll και που θα πρέπει να έχουν κιτ του Microsoft Excel 97 του προγραμματιστή που περιέχει τα απαραίτητα αρχεία κεφαλίδας και τη βιβλιοθήκη για να δημιουργήσετε ένα XLL.

Περισσότερες πληροφορίες

Βήματα για να δημιουργήσετε ένα XLL

  1. Δημιουργήστε ένα νέο έργο AppWizard MFC (.dll) που ονομάζεται Anewxll.
  2. Αντιγράψτε το Xlcall.h, Framewrk.h, Framewrk.c και Xlcall32.lib από το Κιτ Microsoft Excel 97 του προγραμματιστή στον κατάλογο του έργου σας.
  3. Μετονομασία Framewrk.c Framewrk.cpp.
  4. Προσθήκη Framewrk.cpp στα αρχεία προέλευσης του έργου.
  5. Προσθέστε τα ακόλουθα # include γραμμή στην κορυφή της Framewrk.cpp για την αποφυγή σφάλματα μεταγλώττισης σχετικά με την προ-μεταγλωττισμένης κεφαλίδων:
    
          #include "stdafx.h"
    					
  6. Αλλάξτε την ακόλουθη γραμμή στο Framewrk.cpp:
          #include "..\..\include\xlcall.h"
    					
    Για να:
          #include "xlcall.h"
    					
  7. Στο μενού έργο, κάντε κλικ στο κουμπί ρυθμίσεις. Κάντε κλικ στην καρτέλα σύνδεση και να προσθέσετε Xlcall32.lib τις λειτουργικές μονάδες/βιβλιοθήκη αντικειμένων πλαίσιο επεξεργασίας.
  8. Προσθέστε τα ακόλουθα # include προτάσεις στην κορυφή της Anewxll.cpp:
          #include "xlcall.h"
          #include "framewrk.h"
    					
    ΣΗΜΕΊΩΣΗ: Το έργο είναι τώρα το πρόγραμμα εγκατάστασης κατάλληλα και θα πρέπει να καταρτίζουν, Ωστόσο, δεν έχετε προσθέσει υποστήριξη XLL ακόμα. Δώστε τα υπόλοιπα βήματα ορισμένα δείγματα κώδικα που μπορείτε να προσθέσετε XLL για να ξεκινήσετε.

  9. Προσαρτήσετε τον ακόλουθο κώδικα Anewxll.cpp: Δείγμα κώδικα -----------
          //================================================================
          // 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. Προσθέστε τις ακόλουθες γραμμές στο τέλος του αρχείου Anewxll.def:
          xlAutoOpen
          xlAutoClose
          xlAddInManagerInfo
          MyMotd
          MyFunc
    					
  11. Μπορείτε τώρα να μεταγλωττίσετε το έργο σας να παράγει ένα DLL που ονομάζεται Anewxll.dll. Μόλις η μεταγλώττιση του αρχείου DLL, μετονομάστε το σε Anewxll.xll.

Χρησιμοποιώντας το πρόσθετο με το Microsoft Excel

  1. Ξεκινήστε ένα νέο βιβλίο εργασίας στο Microsoft Excel.
  2. Στο μενού Εργαλεία, κάντε κλικ στο κουμπί "Πρόσθετα". Αναζήτηση για να προσθέσετε Anewxll.xll και κάντε κλικ στο OK. Σημειώστε ότι όταν κάνετε κλικ στο κουμπί OK στο παράθυρο διαλόγου πρόσθετα, το xlAutoOpen εκτελείται η συνάρτηση.
  3. Κάντε κλικ στο κουμπί "M.O.T.D" από το μενού MyMenu. Όταν κάνετε κλικ στο στοιχείο μενού σας, εκτελεί τη συνάρτηση MyMotd για να εμφανίσετε ένα MessageBox με μια προσφορά, όπως "Rebekah λέει" διατηρεί Apple ημέρα, τον γιατρό μακριά!'".
  4. Σε ένα κελί, προσθέστε τον ακόλουθο τύπο:
    =MYFUNC(2,6)
    					
    MYFUNC επιστρέφει 12, προϊόν 2 και 6.

  5. Στο μενού Εργαλεία, κάντε κλικ στο κουμπί "Πρόσθετα". Απενεργοποιήστε το πλαίσιο ελέγχου του προσθέτου και κάντε κλικ στο κουμπί OK. Σημειώστε ότι όταν κάνετε κλικ στο OK στο πλαίσιο διαλόγου Add-ins, το xlAutoClose εκτελείται η συνάρτηση.

Πρόσθετες σημειώσεις

Εάν χρησιμοποιείτε Microsoft Visual C++ 6.0, το προηγούμενο παράδειγμα αποτυγχάνει Όταν κάνετε μεταγλωττίσετε σε κατάσταση εντοπισμού σφαλμάτων. Η αποτυχία προκύπτει επειδή ως της Visual C++ 6.0 λεκτικές σταθερές τοποθετούνται σε συμβολοσειρά ανάγνωση μόνο μνήμη debug δημιουργεί και μπάζα που XLL προγραμματιστές χρησιμοποιούν πρόθεμα μήκους τους συμβολοσειρές προκαλεί σφάλμα παραβίασης πρόσβασης. Ως μια εργασία-γύρω, μπορείτε να καταργήσετε το διακόπτη μεταγλωττιστή /ZI στις ρυθμίσεις του έργου σας ή απλώς δοκιμή build έκδοσης. Για περισσότερες πληροφορίες, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft:
198477 PRB: Η χρήση /ZI ενδέχεται να προκαλέσει παραβίαση πρόσβασης

Αναφορές

Για περισσότερες πληροφορίες σχετικά με τις xll, δείτε:
Microsoft Excel 97 του προγραμματιστή Kit (ISBN: 1-57231-498-2)

Ιδιότητες

Αναγν. άρθρου: 178474 - Τελευταία αναθεώρηση: Πέμπτη, 26 Μαΐου 2011 - Αναθεώρηση: 3.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • 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
Λέξεις-κλειδιά: 
kbhowto kbmt KB178474 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:178474

Αποστολή σχολίων