Visual C++ 사용하여 Excel 있는 추가 기능 (XLL) 작성 방법

중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

178474
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
요약
추가 기능을 DLL (동적 연결 라이브러리) 빌드 지원하는 컴파일러를 사용하여 빌드할 수 있는 Microsoft Excel에 있는 XLL이 것입니다. 이 문서에서는 XLL Microsoft Visual C++ 빌드 시작하는 데 설계되었습니다. 이 문서에서 설명하는 단계를 수행하려면 DLL을 빌드하는 일부 경험이 있어야 합니다. 그리고 필요한 헤더 및 라이브러리 파일을 사용하여 XLL 빌드하려면 포함된 Microsoft Excel 97 개발자 키트 있어야 합니다.
추가 정보

XLL 만드는 단계

  1. Anewxll 라는 새 MFC 응용 프로그램 마법사 (.dll) 프로젝트를 만듭니다.
  2. Xlcall.h, Framewrk.h, Framewrk.c, Xlcall32.lib 및 Microsoft Excel 97 개발자 키트는 에서 프로젝트 디렉터리로 복사하십시오.
  3. Framewrk.c를 Framewrk.cpp로 이름을 바꿉니다.
  4. Framewrk.cpp 프로젝트 소스 파일을 추가하십시오.
  5. 다음 추가 줄 미리 컴파일된 헤더에 대한 컴파일러 오류가 발생하지 않도록 Framewrk.cpp 맨 # include:
          #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. 이제 Anewxll.dll 호출된 DLL 만들기 위해 프로젝트를 컴파일할 수 있습니다. DLL 컴파일되면 Anewxll.xll로 이름을 바꿉니다.

Microsoft Excel에서 해당 추가 기능 사용

  1. Microsoft Excel에서 새 통합 문서를 시작하십시오.
  2. 도구 메뉴에서 추가 클릭하십시오. 찾아서 Anewxll.xll 추가하고 확인을 클릭합니다. 추가 기능 대화 상자에서 확인을 누르면 xlAutoOpen 함수를 실행하는 알 수 있습니다.
  3. M.O.T.D MyMenu 메뉴에서 누릅니다. 메뉴 항목을 클릭할 때 "Rebekah '의사 멀리 떨어져 있는 Apple 하루 계속!' 라는" 같은 MessageBox 인용문이 함께 표시하려면 MyMotd 함수를 실행합니다.
  4. 셀에 다음 수식을 추가:
    =MYFUNC(2,6)					
    MYFUNC 12, 2, 6 곱을 반환합니다.

  5. 도구 메뉴에서 추가 클릭하십시오. 추가 기능 확인란 선택을 취소하고 확인을 클릭하십시오. 추가 기능 대화 상자에서 확인을 누르면 xlAutoClose 함수를 실행하는 알 수 있습니다.

추가 정보

Visual C++ 6.0 사용하는 경우 앞의 예제는 디버그 모드에서 컴파일할 때 오류가 발생합니다. Visual C++ 6.0으로 의 디버그 메모리만 빌드하고 XLL 개발자는 해당 문자열 길이-접두사를 사용하여 트릭을 액세스 위반이 발생합니다 문자열 리터럴이 배치됩니다 읽기 때문에 오류가 발생합니다. 한 해결 같이, 프로젝트 설정에서/ZI 컴파일러 스위치를 제거하거나 방금 릴리스 빌드를 테스트할 수 있습니다. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
198477PRB:/ZI 사용 액세스 위반이 발생한다
참조
XLL에 대한 자세한 정보를 참조하십시오.
Microsoft Excel 97 개발자 키트 (ISBN: 1-57231-498-2)
xll vc xlcall xlcall32 xlmhowto

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 178474 - 마지막 검토: 12/05/2015 08:15:03 - 수정: 4.3

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

  • kbnosurvey kbarchive kbmt kbhowto KB178474 KbMtko
피드백