Làm thế nào để xây dựng một Add-in (XLL) cho Excel sử dụng Visual c ++

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:178474
Bài viết này đã được lưu trữ. Bài viết được cung cấp "nguyên trạng" và sẽ không còn được cập nhật nữa.
TÓM TẮT
XLL một là một add-in cho Microsoft Excel mà bạn có thể xây dựng với bất kỳtrình biên dịch hỗ trợ xây dựng DLLs (năng động liên kết thư viện). Bài viết nàyđược thiết kế để giúp bạn bắt đầu xây dựng XLLs với Microsoft Visual C++. Đểlàm theo các bước được nêu trong bài viết này, bạn nên có một số kinh nghiệmxây dựng DLLs và bạn cần phải có của Microsoft Excel 97 Developer Kit,mà chứa tập tin tiêu đề và thư viện cần thiết để xây dựng một XLL.
THÔNG TIN THÊM

Các bước để tạo ra một XLL

  1. Tạo một dự án MFC AppWizard (.dll) mới được gọi là Anewxll.
  2. Sao chép Xlcall.h, Framewrk.h, Framewrk.c và Xlcall32.lib từ các Microsoft Excel 97 Developer Kit thư mục dự án của bạn.
  3. Đổi tên Framewrk.c để Framewrk.cpp.
  4. Thêm Framewrk.cpp vào tập tin nguồn dự án của bạn.
  5. Thêm sau # bao gồm dòng vào phía trên của Framewrk.cpp để tránh trình biên dịch lỗi về có tiêu đề:
          #include "stdafx.h"					
  6. Thay đổi dòng sau trong Framewrk.cpp:
          #include "..\..\include\xlcall.h"					
    để:
          #include "xlcall.h"					
  7. Nhấp vào cài đặt trên menu dự án. Nhấp vào tab liên kết và thêm Xlcall32.lib cho các module đối tượng/thư viện chỉnh sửa hộp.
  8. Thêm sau # bao gồm các báo cáo từ đầu của Anewxll.cpp:
          #include "xlcall.h"      #include "framewrk.h"					
    Lưu Ý: Các dự án là bây giờ thiết lập một cách thích hợp và nên biên dịch, Tuy nhiên, bạn có không được hỗ trợ XLL nêu ra. Cung cấp cho các bước còn lại một số mẫu mã, bạn có thể thêm vào XLL để giúp bạn bắt đầu.

  9. Nối thêm mã sau đây để Anewxll.cpp:Mẫu mã -----------
          //================================================================      // 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. Thêm dòng sau vào cuối tập tin Anewxll.def của bạn:
          xlAutoOpen      xlAutoClose      xlAddInManagerInfo      MyMotd      MyFunc					
  11. Bạn bây giờ có thể biên dịch dự án của bạn để sản xuất một DLL được gọi là Anewxll.dll. Một khi DLL được biên soạn, đổi tên nó để Anewxll.xll.

Bằng cách sử dụng tiện ích trong với Microsoft Excel

  1. Bắt đầu một bảng tính mới trong Microsoft Excel.
  2. Nhấp vào Add-ins trên trình đơn công cụ. Duyệt thêm Anewxll.xll và nhấn OK.Nhận thấy rằng khi bạn bấm OK trong hộp thoại Add-ins, xlAutoOpenchức năng chạy.
  3. Nhấp M.O.T.D vào trình đơn MyMenu.Khi mục trình đơn của bạn được nhấp, chức năng MyMotd chạy để hiển thị một MessageBox với một báo như "Rebekah nói ' một quả táo một ngày, giữ các bác sĩ đi!'".
  4. Trong một tế bào, thêm công thức sau đây:
    =MYFUNC(2,6)					
    MYFUNC trả về 12, sản phẩm thứ 2 và 6.

  5. Nhấp vào Add-ins trên trình đơn công cụ. Bỏ chọn thêm trong hộp kiểm và bấm Ok.Nhận thấy rằng khi bạn bấm OK trong hộp thoại Add-ins, xlAutoClose chức năng chạy.

Thêm ghi chú

Nếu bạn đang sử dụng Microsoft Visual C++ 6.0, ví dụ trước không thành côngkhi bạn biên dịch nó trong chế độ gỡ lỗi. Sự thất bại xảy ra bởi vì như của VisualC++ 6.0, chuỗi literals được đặt trong đọc bộ nhớ chỉ trong gỡ lỗi xây dựng, và bí quyết XLL các nhà phát triển sử dụng để tiền tố chiều dài dây của họ gây ra một sự vi phạm truy cập. Như một công việc-xung quanh, bạn có thể hủy bỏ /ZI trình biên dịch chuyển trong thiết lập dự án của bạn, hoặc chỉ cần kiểm tra phiên bản xây dựng. Để biết thêm chi tiết, xem bài viết sau trong cơ sở kiến thức Microsoft:
198477 PRB: Sử dụng /ZI có thể gây ra sự vi phạm truy cập
THAM KHẢO
Để biết thêm chi tiết liên quan đến XLLs, xin vui lòng xem:
Microsoft Excel 97 Developer Kit (ISBN: 1-57231-498-2)
xll vc xlcall xlcall32 xlmhowto

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 178474 - Xem lại Lần cuối: 12/05/2015 08:15:05 - Bản sửa đổi: 2.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 KbMtvi
Phản hồi