วิธีการสร้างการเพิ่มเข้า (XLL) สำหรับการใช้ c ++ Visual ของ Excel

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 178474 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

XLL มีการเพิ่มไว้สำหรับ Microsoft Excel ที่คุณสามารถสร้าง ด้วยคอมไพเลอร์ที่สนับสนุนการสร้าง DLLs (ไลบรารีการเชื่อมโยงแบบไดนามิก) บทความนี้ถูกออกแบบมาเพื่อขอให้คุณเริ่มการทำงานการสร้าง XLLs กับ Microsoft ในการ Visual c ++ เมื่อต้องการตามขั้นตอน outlined ในบทความนี้ คุณควรมีประสบการณ์บางอย่างสร้าง DLLs และคุณควรมีนักที่ Microsoft Excel 97 พัฒนาของ Kit ซึ่งประกอบด้วยหัวข้อที่จำเป็นและไลบรารีแฟ้มเพื่อสร้างข้อ XLL

ข้อมูลเพิ่มเติม

ขั้นตอนในการสร้างการ XLL

  1. สร้างโครงการการ AppWizard MFC (.dll) ใหม่ที่เรียกว่า Anewxll
  2. คัดลอก Xlcall.h, Framewrk.h, Framewrk.c และ Xlcall32.lib จาก Kit นักที่ Microsoft Excel 97 พัฒนาของไดเรกทอรีโครงการของคุณ
  3. เปลี่ยนชื่อ Framewrk.c Framewrk.cpp
  4. เพิ่ม Framewrk.cpp ไปยังแฟ้มต้นฉบับของโครงการของคุณ
  5. ต่อไปนี้ในการเพิ่ม#รวมบรรทัดไปยังด้านบนของ Framewrk.cpp เพื่อหลีกเลี่ยงข้อผิดพลาดของคอมไพเลอร์เกี่ยวกับ pre-compiled หัว:
    
          #include "stdafx.h"
    					
  6. เปลี่ยนบรรทัดต่อไปนี้ใน Framewrk.cpp:
          #include "..\..\include\xlcall.h"
    					
    เมื่อต้องการไป:
          #include "xlcall.h"
    					
  7. คลิกการตั้งค่าบนเมนูโครงการ คลิกแท็บการเชื่อมโยง และเพิ่ม Xlcall32.lib ลงในกล่องแก้ไขโมดูลที่/ไลบรารีวัตถุ
  8. ต่อไปนี้ในการเพิ่ม#รวมใบแจ้งยอดจากด้านบนของ 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. คลิก Add-คงคลังบนเมนูเครื่องมือ เรียกดูเพื่อเพิ่ม Anewxll.xll และคลิกตกลง ขอให้สังเกตว่า เมื่อคุณคลิกตกลงในกล่องโต้ตอบ Add-คงคลัง ฟังก์ชัน xlAutoOpen รัน
  3. คลิก M.O.T.D บนเมนู MyMenu เมื่อคุณคลิกรายการเมนูของคุณ ฟังก์ชัน MyMotd ทำงานเพื่อแสดงแบบ MessageBox กับใบเสนอราคาเช่น "Rebekah แจ้ง 'ของ Apple ข้อใดวัน จะแพทย์เก็บ"
  4. ในเซลล์ เพิ่มสูตรต่อไปนี้:
    =MYFUNC(2,6)
    					
    MYFUNC ส่งกลับค่า 12 ผลิตภัณฑ์ 2 และ 6

  5. คลิก Add-คงคลังบนเมนูเครื่องมือ ยกเลิกเลือกกล่องกาเครื่องหมายเพิ่มใน และคลิกตกลง ขอให้สังเกตว่า เมื่อคุณคลิกตกลงในกล่องโต้ตอบ Add-คงคลัง ฟังก์ชัน xlAutoClose รัน

หมายเหตุเพิ่มเติม

ถ้าคุณใช้ Microsoft Visual c ++ 6.0 ตัวอย่างก่อนหน้านี้ล้มเหลวเมื่อคุณคอมไพล์ในโหมดการดีบัก ความล้มเหลวเกิดขึ้นเนื่องจากเป็นของ c ++ 6.0 Visual สายอักขระที่มีใส่ตัวอักษรในอ่านสร้างหน่วยความจำที่เพียงอย่างเดียวในการตรวจแก้จุดบกพร่อง และเทคนิคให้นักพัฒนา XLL ใช้กับหมายเลขนำหน้าของความยาวของสตริงการทำให้เกิดการละเมิดการเข้าถึง เป็นการทำงานรอบ ๆ คุณสามารถลบสวิตช์ของคอมไพเลอร์ /ZI ในการตั้งค่าโครงการของคุณ หรือออกแบบโครงสร้างทดสอบเท่านั้น สำหรับข้อมูลเพิ่มเติม ให้ดูบทความในฐานความรู้ของ Microsoft ต่อไปนี้:
198477PRB: ใช้ /ZI อาจทำให้เกิดการละเมิดการเข้าถึง

ข้อมูลอ้างอิง

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ XLLs กรุณาดู:
นัก Microsoft Excel 97 พัฒนาของ Kit (ISBN: 1-57231-498-2)

คุณสมบัติ

หมายเลขบทความ (Article ID): 178474 - รีวิวครั้งสุดท้าย: 7 มกราคม 2554 - Revision: 4.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
Keywords: 
kbhowto kbmt KB178474 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:178474

ให้ข้อเสนอแนะ

 

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