Ένα XLL είναι ένα πρόσθετο για το Microsoft Excel που δημιουργείτε με οποιοδήποτε
πρόγραμμα μεταγλώττισης που υποστηρίζει τη δημιουργία dll (βιβλιοθήκες δυναμικής σύνδεσης). Αυτό το άρθρο
έχει σχεδιαστεί για να ξεκινήσετε τη δημιουργία xll με Microsoft Visual C++. Για να
Ακολουθήστε τα βήματα που περιγράφονται σε αυτό το άρθρο, θα πρέπει να έχετε κάποια εμπειρία
Δόμηση dll και που θα πρέπει να έχουν κιτ του Microsoft Excel 97 του προγραμματιστή
που περιέχει τα απαραίτητα αρχεία κεφαλίδας και τη βιβλιοθήκη για να δημιουργήσετε ένα XLL.
Δημιουργήστε ένα νέο έργο AppWizard MFC (.dll) που ονομάζεται Anewxll.
Αντιγράψτε το Xlcall.h, Framewrk.h, Framewrk.c και Xlcall32.lib από το
Κιτ Microsoft Excel 97 του προγραμματιστή στον κατάλογο του έργου σας.
Μετονομασία Framewrk.c Framewrk.cpp.
Προσθήκη Framewrk.cpp στα αρχεία προέλευσης του έργου.
Προσθέστε τα ακόλουθα # include γραμμή στην κορυφή της Framewrk.cpp για την αποφυγή
σφάλματα μεταγλώττισης σχετικά με την προ-μεταγλωττισμένης κεφαλίδων:
#include "stdafx.h"
Αλλάξτε την ακόλουθη γραμμή στο Framewrk.cpp:
#include "..\..\include\xlcall.h"
Για να:
#include "xlcall.h"
Στο μενού έργο, κάντε κλικ στο κουμπί ρυθμίσεις. Κάντε κλικ στην καρτέλα σύνδεση και να προσθέσετε
Xlcall32.lib τις λειτουργικές μονάδες/βιβλιοθήκη αντικειμένων πλαίσιο επεξεργασίας.
Προσθέστε τα ακόλουθα # include προτάσεις στην κορυφή της Anewxll.cpp:
#include "xlcall.h"
#include "framewrk.h"
ΣΗΜΕΊΩΣΗ: Το έργο είναι τώρα το πρόγραμμα εγκατάστασης κατάλληλα και θα πρέπει να καταρτίζουν,
Ωστόσο, δεν έχετε προσθέσει υποστήριξη XLL ακόμα. Δώστε τα υπόλοιπα βήματα
ορισμένα δείγματα κώδικα που μπορείτε να προσθέσετε XLL για να ξεκινήσετε.
Προσαρτήσετε τον ακόλουθο κώδικα 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;
}
//=================================================================
Προσθέστε τις ακόλουθες γραμμές στο τέλος του αρχείου Anewxll.def:
Μπορείτε τώρα να μεταγλωττίσετε το έργο σας να παράγει ένα DLL που ονομάζεται Anewxll.dll.
Μόλις η μεταγλώττιση του αρχείου DLL, μετονομάστε το σε Anewxll.xll.
Χρησιμοποιώντας το πρόσθετο με το Microsoft Excel
Ξεκινήστε ένα νέο βιβλίο εργασίας στο Microsoft Excel.
Στο μενού Εργαλεία, κάντε κλικ στο κουμπί "Πρόσθετα". Αναζήτηση για να προσθέσετε Anewxll.xll και κάντε κλικ στο OK.
Σημειώστε ότι όταν κάνετε κλικ στο κουμπί OK στο παράθυρο διαλόγου πρόσθετα, το xlAutoOpen
εκτελείται η συνάρτηση.
Κάντε κλικ στο κουμπί "M.O.T.D" από το μενού MyMenu.
Όταν κάνετε κλικ στο στοιχείο μενού σας, εκτελεί τη συνάρτηση MyMotd για να εμφανίσετε ένα
MessageBox με μια προσφορά, όπως "Rebekah λέει" διατηρεί Apple ημέρα,
τον γιατρό μακριά!'".
Σε ένα κελί, προσθέστε τον ακόλουθο τύπο:
=MYFUNC(2,6)
MYFUNC επιστρέφει 12, προϊόν 2 και 6.
Στο μενού Εργαλεία, κάντε κλικ στο κουμπί "Πρόσθετα". Απενεργοποιήστε το πλαίσιο ελέγχου του προσθέτου και κάντε κλικ στο κουμπί
OK.
Σημειώστε ότι όταν κάνετε κλικ στο OK στο πλαίσιο διαλόγου Add-ins, το xlAutoClose
εκτελείται η συνάρτηση.
Πρόσθετες σημειώσεις
Εάν χρησιμοποιείτε Microsoft Visual C++ 6.0, το προηγούμενο παράδειγμα αποτυγχάνει
Όταν κάνετε μεταγλωττίσετε σε κατάσταση εντοπισμού σφαλμάτων. Η αποτυχία προκύπτει επειδή ως της Visual
C++ 6.0 λεκτικές σταθερές τοποθετούνται σε συμβολοσειρά ανάγνωση μόνο μνήμη debug δημιουργεί και μπάζα που XLL προγραμματιστές χρησιμοποιούν πρόθεμα μήκους τους συμβολοσειρές προκαλεί σφάλμα παραβίασης πρόσβασης. Ως μια εργασία-γύρω, μπορείτε να καταργήσετε το διακόπτη μεταγλωττιστή /ZI στις ρυθμίσεις του έργου σας ή απλώς δοκιμή build έκδοσης. Για περισσότερες πληροφορίες, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft:
Αναγν. άρθρου: 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
Πόση προσπάθεια καταβάλλατε για να χρησιμοποιήσετε αυτό το άρθρο;
Πολύ λίγη
Λίγη
Μέτρια
Μεγάλη
Πολύ μεγάλη
Πείτε μας για ποιον λόγο και με ποιον τρόπο θα μπορούσαμε να βελτιώσουμε αυτές τις πληροφορίες
Σας ευχαριστούμε! Τα σχόλιά σας θα μας βοηθήσουν να βελτιώσουμε το περιεχόμενο υποστήριξης. Για περισσότερες επιλογές βοήθειας, επισκεφτείτε την αρχική σελίδα της Βοήθειας και υποστήριξης.