ขณะนี้คุณออฟไลน์อยู่ กำลังรออินเทอร์เน็ตเพื่อเชื่อมต่ออีกครั้ง

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

ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ

ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้: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)
xll vc xlcall xlcall32 xlmhowto

คุณสมบัติ

รหัสบทความ: 178474 - การตรวจสอบครั้งสุดท้าย: 12/05/2015 08:15:04 - ฉบับแก้ไข: 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

  • kbnosurvey kbarchive kbhowto kbmt KB178474 KbMtth
คำติชม