Bagaimana membangun Add-in (XLL) untuk Excel menggunakan Visual C++

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 178474 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

XLL adalah Tambah-in untuk Microsoft Excel yang Anda dapat membangun dengan compiler yang mendukung membangun dll (dynamic link Library). Artikel ini dirancang untuk mendapatkan Anda mulai membangun XLLs dengan Microsoft Visual C++. Pada Ikuti langkah-langkah yang dijelaskan dalam artikel ini, Anda harus memiliki beberapa pengalaman membangun dll dan Anda harus memiliki Kit Microsoft Excel 97 pengembang, yang berisi file header dan perpustakaan yang diperlukan untuk membangun XLL.

INFORMASI LEBIH LANJUT

Langkah-langkah untuk membuat XLL

  1. Membuat proyek MFC AppWizard (.dll) baru yang disebut Anewxll.
  2. Salin Xlcall.h, Framewrk.h, Framewrk.c, dan Xlcall32.lib dari Microsoft Excel 97 pengembang Kit ke direktori proyek Anda.
  3. Ubah nama Framewrk.c to Framewrk.cpp.
  4. Tambahkan Framewrk.cpp ke file sumber proyek Anda.
  5. Tambahkan berikut # termasuk baris ke atas Framewrk.cpp untuk menghindari kesalahan kompilator tentang dikompilasi header:
    
          #include "stdafx.h"
    					
  6. Mengubah baris berikut di Framewrk.cpp:
          #include "..\..\include\xlcall.h"
    					
    untuk:
          #include "xlcall.h"
    					
  7. Klik pengaturan pada menu proyek. Klik Link tab dan menambahkan Xlcall32.lib untuk modul perpustakaan objek/mengedit kotak.
  8. Tambahkan berikut # termasuk pernyataan ke atas Anewxll.cpp:
          #include "xlcall.h"
          #include "framewrk.h"
    					
    Catatan: Proyek sekarang setup tepat dan harus mengkompilasi, Namun, Anda tidak menambahkan dukungan XLL belum. Memberikan langkah-langkah yang tersisa beberapa contoh kode Anda dapat menambahkan XLL untuk Anda mulai.

  9. Tambahkan kode berikut untuk Anewxll.cpp: Contoh kode -----------
          //================================================================
          // 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. Tambahkan baris berikut pada akhir berkas Anewxll.def:
          xlAutoOpen
          xlAutoClose
          xlAddInManagerInfo
          MyMotd
          MyFunc
    					
  11. Anda sekarang dapat mengkompilasi proyek Anda untuk menghasilkan DLL yang disebut Anewxll.dll. Setelah DLL dikompilasi, mengubah nama itu untuk Anewxll.xll.

Menggunakan Add-In dengan Microsoft Excel

  1. Mulai buku kerja baru di Microsoft Excel.
  2. Klik Add-in pada menu alat. Browse untuk menambahkan Anewxll.xll dan klik OK. Perhatikan bahwa ketika Anda klik OK dalam dialog Add-in, xlAutoOpen fungsi berjalan.
  3. Klik M.O.T.D pada MyMenu menu. Ketika item menu Anda diklik, fungsi MyMotd berjalan untuk menampilkan MessageBox dengan kutipan seperti "Ribka mengatakan ' sebuah apel sehari, membuat dokter pergi!'".
  4. Dalam sel, menambahkan rumus berikut:
    =MYFUNC(2,6)
    					
    MYFUNC kembali 12, produk 2 dan 6.

  5. Klik Add-in pada menu alat. Mengosongkan kotak centang Tambah-in dan klik Baiklah. Perhatikan bahwa ketika Anda klik OK di kotak dialog Add-in, xlAutoClose fungsi berjalan.

Catatan tambahan

Jika Anda menggunakan Microsoft Visual C++ 6.0, contoh sebelumnya gagal Ketika Anda mengkompilasi dalam modus Debug. Kegagalan terjadi karena sebagai dari Visual C++ 6.0, string literal ditempatkan dalam membaca hanya memori dalam debug membangun, dan trik bahwa XLL pengembang menggunakan untuk awalan panjang string mereka menyebabkan pelanggaran akses. Sebagai kerja-sekitar, Anda dapat menghapus tombol kompiler /ZI dalam pengaturan proyek Anda, atau hanya menguji membangun rilis. Untuk informasi lebih lanjut, lihat artikel berikut pada Basis Pengetahuan Microsoft:
198477 PRB: Penggunaan /ZI dapat menyebabkan pelanggaran akses

REFERENSI

Untuk informasi lebih lanjut mengenai XLLs, lihat:
Microsoft Excel 97 pengembang Kit (ISBN: 1-57231-498-2)

Properti

ID Artikel: 178474 - Kajian Terakhir: 16 September 2011 - Revisi: 2.0
Berlaku bagi:
  • 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
Kata kunci: 
kbhowto kbmt KB178474 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:178474

Berikan Masukan

 

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