C++¿¡¼­ MFC³ª #import¸¦ »ç¿ëÇÏÁö ¾Ê°í ExcelÀ» ÀÚµ¿È­ÇÏ´Â ¹æ¹ý

±â¼ú ÀÚ·á: 216686 - ÀÌ ¹®¼­°¡ Àû¿ëµÇ´Â Á¦Ç° º¸±â.
¸ðµÎ È®´ë | ¸ðµÎ Ãà¼Ò

¿ä¾à

C++¿¡¼­ Á÷Á¢ ÀÚµ¿È­ Äڵ带 ÀÛ¼ºÇÏ¸é ´ÙÀ½°ú °°Àº ¸î °¡Áö ÀåÁ¡ÀÌ ÀÖ½À´Ï´Ù. ¹«¾ùº¸´Ùµµ, ¿øÇÏ´Â °ÍÀ» Á¤È®ÇÏ°Ô ¼öÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½À¸·Î, Äڵ尡 ´õ ÀÛ¾ÆÁö°í, »¡¶óÁö°í, µð¹ö±ëÇϱⰡ ½¬¿öÁý´Ï´Ù. ¸¶Áö¸·À¸·Î, ¾î¶² ¶óÀ̺귯¸®¿¡µµ Á¾¼ÓµÇÁö ¾Ê½À´Ï´Ù. MFCÀÇ ·¡ÆÛ Ŭ·¡½º³ª Visual C++ÀÇ ±âº» COM Áö¿ø(#import)¸¸À» »ç¿ëÇÏ´Â °æ¿ì¿¡µµ À̵é ÇÁ·¹ÀÓ¿öÅ©¿¡¼­ ÀϹÝÀûÀ¸·Î ¹ß»ýÇÏ´Â ¹ö±×¿Í Á¦ÇÑÀ» ÇØ°áÇÏ·Á¸é IDispatch¿Í COM ÀÚµ¿È­ÀÇ ³»¿ëÀ» ÀÚ¼¼È÷ Á¶»çÇØ¾ß ÇÒ ¼ö ÀÖ½À´Ï´Ù.

Ãß°¡ Á¤º¸

C++¸¸À» »ç¿ëÇÏ¿© ExcelÀ» ÀÚµ¿È­ÇÏ´Â °£´ÜÇÑ Visual C++ 6.0 ÄÜ¼Ö ÀÀ¿ë ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ·Á¸é ¾Æ·¡ÀÇ ´Ü°è¸¦ ¼öÇàÇϽʽÿÀ.
  1. Visual C++ 6.0À» ½ÃÀÛÇϰí XlCpp¶ó´Â Win32 ÄÜ¼Ö ÀÀ¿ë ÇÁ·Î±×·¥À» »õ·Î ¸¸µì´Ï´Ù. "Hello, World!" ÀÀ¿ë ÇÁ·Î±×·¥À» ¼±ÅÃÇϰí Finish¸¦ ´©¸¨´Ï´Ù.
  2. »ý¼ºµÈ XlCpp.cpp¸¦ ¿­°í main() ÇÔ¼ö ¾Õ¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
    #include <ole2.h> // OLE2 Definitions
    
    // AutoWrap() - Automation helper function...
    HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) {
        // Begin variable-argument list...
        va_list marker;
        va_start(marker, cArgs);
    
        if(!pDisp) {
            MessageBox(NULL, "NULL IDispatch passed to AutoWrap()", "Error", 0x10010);
            _exit(0);
        }
    
        // Variables used...
        DISPPARAMS dp = { NULL, NULL, 0, 0 };
        DISPID dispidNamed = DISPID_PROPERTYPUT;
        DISPID dispID;
        HRESULT hr;
        char buf[200];
        char szName[200];
    
        
        // Convert down to ANSI
        WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);
        
        // Get DISPID for name passed...
        hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
        if(FAILED(hr)) {
            sprintf(buf, "IDispatch::GetIDsOfNames(\"%s\") failed w/err 0x%08lx", szName, hr);
            MessageBox(NULL, buf, "AutoWrap()", 0x10010);
            _exit(0);
            return hr;
        }
        
        // Allocate memory for arguments...
        VARIANT *pArgs = new VARIANT[cArgs+1];
        // Extract arguments...
        for(int i=0; i<cArgs; i++) {
            pArgs[i] = va_arg(marker, VARIANT);
        }
        
        // Build DISPPARAMS
        dp.cArgs = cArgs;
        dp.rgvarg = pArgs;
        
        // Handle special-case for property-puts!
        if(autoType & DISPATCH_PROPERTYPUT) {
            dp.cNamedArgs = 1;
            dp.rgdispidNamedArgs = &dispidNamed;
        }
        
        // Make the call!
        hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
        if(FAILED(hr)) {
            sprintf(buf, "IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx", szName, dispID, hr);
            MessageBox(NULL, buf, "AutoWrap()", 0x10010);
            _exit(0);
            return hr;
        }
        // End variable-argument section...
        va_end(marker);
        
        delete [] pArgs;
        
        return hr;
    }
    						
  3. main() ÇÔ¼ö ³»ºÎ¿¡¼­ printf() ÁÙÀ» ´ÙÀ½ ÄÚµå·Î ´ëüÇÕ´Ï´Ù.
       // Initialize COM for this thread...
       CoInitialize(NULL);
    
       // Get CLSID for our server...
       CLSID clsid;
       HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
    
       if(FAILED(hr)) {
    
          ::MessageBox(NULL, "CLSIDFromProgID() failed", "Error", 0x10010);
          return -1;
       }
    
       // Start server and get IDispatch...
       IDispatch *pXlApp;
       hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
       if(FAILED(hr)) {
          ::MessageBox(NULL, "Excel not registered properly", "Error", 0x10010);
          return -2;
       }
    
       // Make it visible (i.e. app.visible = 1)
       {
    
          VARIANT x;
          x.vt = VT_I4;
          x.lVal = 1;
          AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x);
       }
    
       // Get Workbooks collection
       IDispatch *pXlBooks;
       {
          VARIANT result;
          VariantInit(&result);
          AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
          pXlBooks = result.pdispVal;
       }
    
       // Call Workbooks.Add() to get a new workbook...
       IDispatch *pXlBook;
       {
          VARIANT result;
          VariantInit(&result);
          AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Add", 0);
          pXlBook = result.pdispVal;
       }
    
       // Create a 15x15 safearray of variants...
       VARIANT arr;
       arr.vt = VT_ARRAY | VT_VARIANT;
       {
          SAFEARRAYBOUND sab[2];
          sab[0].lLbound = 1; sab[0].cElements = 15;
          sab[1].lLbound = 1; sab[1].cElements = 15;
          arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);
       }
    
       // Fill safearray with some values...
       for(int i=1; i<=15; i++) {
          for(int j=1; j<=15; j++) {
             // Create entry value for (i,j)
             VARIANT tmp;
             tmp.vt = VT_I4;
             tmp.lVal = i*j;
             // Add to safearray...
             long indices[] = {i,j};
             SafeArrayPutElement(arr.parray, indices, (void *)&tmp);
          }
       }
    
       // Get ActiveSheet object
       IDispatch *pXlSheet;
       {
          VARIANT result;
          VariantInit(&result);
          AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);
          pXlSheet = result.pdispVal;
       }
    
       // Get Range object for the Range A1:O15...
       IDispatch *pXlRange;
       {
          VARIANT parm;
          parm.vt = VT_BSTR;
          parm.bstrVal = ::SysAllocString(L"A1:O15");
    
          VARIANT result;
          VariantInit(&result);
          AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
          VariantClear(&parm);
    
          pXlRange = result.pdispVal;
       }
    
       // Set range with our safearray...
       AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);
    
       // Wait for user...
       ::MessageBox(NULL, "All done.", "Notice", 0x10000);
    
       // Set .Saved property of workbook to TRUE so we aren't prompted
       // to save when we tell Excel to quit...
       {
          VARIANT x;
          x.vt = VT_I4;
          x.lVal = 1;
          AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlBook, L"Saved", 1, x);
       }
    
       // Tell Excel to quit (i.e. App.Quit)
       AutoWrap(DISPATCH_METHOD, NULL, pXlApp, L"Quit", 0);
    
       // Release references...
       pXlRange->Release();
       pXlSheet->Release();
       pXlBook->Release();
       pXlBooks->Release();
       pXlApp->Release();
       VariantClear(&arr);
    
       // Uninitialize COM for this thread...
       CoUninitialize();
    						
  4. ÄÄÆÄÀÏÇÏ°í ½ÇÇàÇÕ´Ï´Ù.
AutoWrap() ÇÔ¼ö´Â Á÷Á¢ IDispatch¸¦ »ç¿ëÇÏ´Â °Í°ú °ü·ÃµÈ ´ëºÎºÐÀÇ ÇÏÀ§ ¼öÁØ ¼¼ºÎ »çÇ×À» ´Ü¼øÈ­ÇÕ´Ï´Ù. »ç¿ëÀÚ ÀÚ½ÅÀÇ ±¸Çö¿¡¼­ ÀÚÀ¯·Ó°Ô »ç¿ëÇϽʽÿÀ. ÇÑ °¡Áö ÁÖÀÇÇÒ Á¡Àº ¿©·¯ °³ÀÇ ¸Å°³ º¯¼ö¸¦ Àü´ÞÇÒ ¶§´Â ¿ª¼øÀ¸·Î Àü´ÞÇØ¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¸é ´ÙÀ½°ú °°½À´Ï´Ù.
    VARIANT parm[3];
    parm[0].vt = VT_I4; parm[0].lVal = 1;
    parm[1].vt = VT_I4; parm[1].lVal = 2;
    parm[2].vt = VT_I4; parm[2].lVal = 3;
    AutoWrap(DISPATCH_METHOD, NULL, pDisp, L"call", 3, parm[2], parm[1], parm[0]);
				

ÂüÁ¶

Visual C++¸¦ »ç¿ëÇÑ Office ÀÚµ¿È­¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº Microsoft ±â¼ú ÀÚ·áÀÇ ´ÙÀ½ ¹®¼­¸¦ ÂüÁ¶ÇϽʽÿÀ.
196776 Visual C++¸¦ »ç¿ëÇÑ Office ÀÚµ¿È­
216388 FILE: B2CSE.exe°¡ Visual Basic ÀÚµ¿È­ Äڵ带 Visual C++·Î º¯È¯ÇÑ´Ù
(c) Microsoft Corporation 1999, All Rights Reserved. ±â°í: Joe Crump, Microsoft Corporation.





Microsoft Á¦Ç° °ü·Ã ±â¼ú Àü¹®°¡µé°ú ¿Â¶óÀÎÀ¸·Î Á¤º¸¸¦ ±³È¯ÇϽ÷Á¸é Microsoft ´º½º ±×·ì¿¡ Âü¿©ÇϽñ⠹ٶø´Ï´Ù.

¼Ó¼º

±â¼ú ÀÚ·á: 216686 - ¸¶Áö¸· °ËÅä: 2004³â 7¿ù 21ÀÏ ¼ö¿äÀÏ - ¼öÁ¤: 4.1
º» ¹®¼­ÀÇ Á¤º¸´Â ´ÙÀ½ÀÇ Á¦Ç°¿¡ Àû¿ëµË´Ï´Ù.
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 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
Ű¿öµå:?
kbhowto kbautomation KB216686

Çǵå¹é º¸³»±â