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

ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.

Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη: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, το προηγούμενο παράδειγμα αποτυγχάνειΌταν κάνετε μεταγλωττίσετε σε κατάσταση εντοπισμού σφαλμάτων. Η αποτυχία προκύπτει επειδή ως της VisualC++ 6.0 λεκτικές σταθερές τοποθετούνται σε συμβολοσειρά ανάγνωση μόνο μνήμη debug δημιουργεί και μπάζα που XLL προγραμματιστές χρησιμοποιούν πρόθεμα μήκους τους συμβολοσειρές προκαλεί σφάλμα παραβίασης πρόσβασης. Ως μια εργασία-γύρω, μπορείτε να καταργήσετε το διακόπτη μεταγλωττιστή /ZI στις ρυθμίσεις του έργου σας ή απλώς δοκιμή build έκδοσης. Για περισσότερες πληροφορίες, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft:
198477 PRB: Η χρήση /ZI ενδέχεται να προκαλέσει παραβίαση πρόσβασης
Αναφορές
Για περισσότερες πληροφορίες σχετικά με τις xll, δείτε:
Microsoft Excel 97 του προγραμματιστή Kit (ISBN: 1-57231-498-2)
xll vc xlcall xlcall32 xlmhowto

Προειδοποίηση: Αυτό το άρθρο έχει μεταφραστεί αυτόματα

Ιδιότητες

Αναγνωριστικό άρθρου: 178474 - Τελευταία αναθεώρηση: 12/05/2015 08:15:02 - Αναθεώρηση: 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

  • kbnosurvey kbarchive kbhowto kbmt KB178474 KbMtel
Σχόλια