Bir eklenti (XLL) için Visual C++ kullanarak Excel üretme

Makale çevirileri Makale çevirileri
Makale numarası: 178474 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Bir eklenti, dll (devingen bağlantı kitaplığı) oluşturma'yı destekleyen herhangi bir derleyici ile oluşturmak, Microsoft Excel'in bir XLL olur. Bu makalede, Microsoft Visual C++ ile XLLs oluşturma başlangıç için tasarlanmıştır. Bu makalede özetlenen adımları için <a0></a0>, DLL'leri oluştururken bazı deneyimi olmalıdır ve gerekli üstbilgisi ve bir XLL oluşturmak için kitaplık dosyaları içeren Microsoft Excel 97 Developer's Kit'te olmalıdır.

Daha fazla bilgi

Bir XLL oluşturma adımları

  1. Anewxll adlı yeni bir MFC AppWizard (.dll) projesi oluşturun.
  2. Microsoft Excel 97 Geliştirici Seti'nden, Xlcall.h, Framewrk.h, Framewrk.c ve Xlcall32.lib proje dizininize kopyalayın.
  3. Framewrk.c Framewrk.cpp için yeniden adlandırın.
  4. Framewrk.cpp projenin kaynak dosyasına ekleyin.
  5. Aşağıdaki ekleme # include Framewrk.cpp pre-compiled üstbilgileri hakkında derleyici hatalarını önlemek için üst satır:
    
          #include "stdafx.h"
    					
  6. Framewrk.cpp, aşağıdaki satırı değiştirin:
          #include "..\..\include\xlcall.h"
    					
    için:
          #include "xlcall.h"
    					
  7. Proje menüsünde, Ayarlar'ı tıklatın. Bağlantı sekmesini tıklatın ve Xlcall32.lib nesne/kitaplık modülleri düzenleme kutusuna ekleyin.
  8. Aşağıdaki ekleme # ifadeleri Anewxll.cpp en üstüne ekleyin:
          #include "xlcall.h"
          #include "framewrk.h"
    					
    Not: Proje şimdi Kur uygun şekilde, derlemeniz, ancak XLL desteği henüz eklediğiniz değil. Kalan adımları, başlangıç için XLL için eklediğiniz bazı örnek kodlar verin.

  9. Anewxll.cpp için aşağıdaki kodu ekleyin: örnek kodu-----------
          //================================================================
          // 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 dosya sonuna aşağıdaki satırları ekleyin:
          xlAutoOpen
          xlAutoClose
          xlAddInManagerInfo
          MyMotd
          MyFunc
    					
  11. Projenizi Anewxll.dll adlı bir DLL DOSYASı oluşturmak için şimdi derleyebilirsiniz. DLL derlenmiş bir kez Anewxll.xll için yeniden adlandırın.

Eklenti Microsoft Excel'le birlikte kullanma

  1. Yeni bir çalışma kitabını Microsoft Excel'in başlatın.
  2. Eklentiler, Araçlar menüsünden Seçenekler'i tıklatın. Bulun Anewxll.XLL ekleyin ve Tamam'ı tıklatın. Eklentileri iletişim kutusunda Tamam'ı tıklattığınızda xlAutoOpen işlevi çalıştığını fark.
  3. M.O.T.D MyMenu menüsünden'ı tıklatın. Menü öğe tıklatıldığında MyMotd işlevi "Rebekah 'Günde bir Apple doktorun yerine tutar!' yazan"gibi bir MessageBox teklif ile görüntülemek için çalışır.
  4. Aşağıdaki formülü bir hücreye ekleyin:
    =MYFUNC(2,6)
    					
    MYFUNC 12, 2 ve 6 çarpımını verir.

  5. Eklentiler, Araçlar menüsünden Seçenekler'i tıklatın. Eklenti onay kutusunu temizleyin ve Tamam'ı tıklatın. XlAutoClose işlevi <a0>Eklentiler</a0> iletişim kutusunda Tamam'ı tıklattığınızda, çalışan dikkat edin.

Ek notlar

Microsoft Visual C++ 6.0 kullanıyorsanız, yukarıdaki örnek hata ayıklama modunda derlerken başarısız olur. Dize hazır bilgi yerleştirilir, yalnızca hata ayıklama bellek oluşturur ve XLL geliştiriciler kendi dizelerinin uzunluğu-önek kullanın eli erişim ihlaline neden oluyor Visual C++ 6.0 olarak okuma hatası oluşur. Bir iş-geçici, proje ayarlarınızda /ZI derleyici anahtarı kaldırmak veya yalnızca sürüm oluşturma sınayın. Daha fazla bilgi için, aşağıdaki Microsoft Bilgi Bankası makalesine bakın:
198477SORUN: /ZI kullanılması erişim ihlaline neden olabilir

Referanslar

XLLs hakkında daha fazla bilgi için lütfen bkz:
Microsoft Excel 97 Developer's Kit'i (ISBN: 1-57231-498-2)

Özellikler

Makale numarası: 178474 - Last Review: 12 Şubat 2007 Pazartesi - Gözden geçirme: 4.3
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Anahtar Kelimeler: 
kbmt kbhowto KB178474 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:178474

Geri Bildirim Ver

 

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