Как построить надстроек (XLL) для Microsoft Excel с помощью Visual C++

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

Эта статья на английском языке:178474
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Аннотация
Надстройка для Microsoft Excel, можно создать с помощью любой компилятор, который поддерживает создание библиотек DLL (библиотек динамической компоновки) является XLL-МОДУЛЯ. Статья предназначена для начала создания XLL-модулей с помощью Microsoft Visual C++. Чтобы выполнить действия, описанные в данной статье, должны иметь некоторые возможности создания библиотеки DLL и необходимо иметь пакет разработчика Microsoft Excel 97, который содержит необходимые заголовка и файлы библиотеки для создания XLL-МОДУЛЯ.
Дополнительная информация

Шаги для создания XLL-МОДУЛЯ

  1. Создайте новый проект MFC AppWizard (.dll) с именем Anewxll.
  2. Копирование Xlcall.h, Framewrk.h, Framewrk.c и Xlcall32.lib комплект разработчика Microsoft Excel 97 в каталоге проекта.
  3. Переименуйте Framewrk.c Framewrk.cpp.
  4. Добавьте Framewrk.cpp в исходных файлах проекта.
  5. Добавьте следующий код # include строки в верхней части Framewrk.cpp во избежание ошибок компилятора о предкомпилированных заголовках:
          #include "stdafx.h"					
  6. Измените следующую строку в Framewrk.cpp:
          #include "..\..\include\xlcall.h"					
    Кому::
          #include "xlcall.h"					
  7. Нажмите кнопку «Параметры» в меню проект. Перейдите на вкладку связь и добавьте Xlcall32.lib поле модули объектов/библиотек.
  8. Добавьте следующий код # include инструкции в верхней части 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. Выберите команду надстройки в меню Сервис. Обзор Anewxll.xll и нажмите кнопку ОК. Обратите внимание, что при нажатии кнопки ОК в диалоговом окне надстройки xlAutoOpen функции выполняется.
  3. В меню M.O.T.D MyMenu. При выборе элемента меню MyMotd функция выполняется для отображения MessageBox с предложением, такие как «Rebekah текстом "Apple в день, сохраняет врач нет на месте"!».
  4. В ячейке добавьте следующую формулу:
    =MYFUNC(2,6)					
    MYFUNC возвращает 12 продукта 2 и 6.

  5. Выберите команду надстройки в меню Сервис. Снимите флажок «надстройки» и нажмите кнопку ОК. Обратите внимание, что при нажатии кнопки ОК в диалоговом окне Add-ins, функция xlAutoClose выполняется.

Дополнительные примечания

При использовании Microsoft Visual C++ 6.0, предыдущего примера происходит сбой при компиляции в режиме отладки. Ошибка возникает, если для Visual C++ 6.0, чтение строковые литералы, помещаются в памяти только в отладочных построений и прием, что разработчики XLL-МОДУЛЯ позволяет префикса длины их строки вызывает нарушение прав доступа. Как обходной удалите параметр компилятора /ZI в параметры проекта, или просто проверить построения выпуска. Дополнительные сведения см. в следующей статье базы знаний Майкрософт::
198477Проблема: Использование параметра/Zi может вызвать нарушение прав доступа
Ссылки
Для получения дополнительных сведений о XLL-модулей обратитесь к:
Пакет разработчика Microsoft Excel 97 (ISBN: 1-57231-498-2)
xlcall xlcall32 XLL vc xlmhowto

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 178474 — последний просмотр: 12/05/2015 08:15:04 — редакция: 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 KbMtru
Отзывы и предложения