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

기술 자료 번역 기술 자료 번역
기술 자료: 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)

속성

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

피드백 보내기

 

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