C++¿¡¼ MFC³ª #import¸¦ »ç¿ëÇÏÁö ¾Ê°í ExcelÀ» ÀÚµ¿ÈÇÏ´Â ¹æ¹ý C++¿¡¼ Á÷Á¢ ÀÚµ¿È Äڵ带 ÀÛ¼ºÇÏ¸é ´ÙÀ½°ú °°Àº ¸î °¡Áö ÀåÁ¡ÀÌ ÀÖ½À´Ï´Ù. ¹«¾ùº¸´Ùµµ, ¿øÇÏ´Â °ÍÀ»
Á¤È®ÇÏ°Ô ¼öÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½À¸·Î, Äڵ尡 ´õ ÀÛ¾ÆÁö°í, »¡¶óÁö°í, µð¹ö±ëÇϱⰡ ½¬¿öÁý´Ï´Ù. ¸¶Áö¸·À¸·Î, ¾î¶² ¶óÀ̺귯¸®¿¡µµ Á¾¼ÓµÇÁö
¾Ê½À´Ï´Ù. MFCÀÇ ·¡ÆÛ Ŭ·¡½º³ª Visual C++ÀÇ ±âº» COM Áö¿ø(#import)¸¸À» »ç¿ëÇÏ´Â °æ¿ì¿¡µµ À̵é ÇÁ·¹ÀÓ¿öÅ©¿¡¼ ÀϹÝÀûÀ¸·Î
¹ß»ýÇÏ´Â ¹ö±×¿Í Á¦ÇÑÀ» ÇØ°áÇÏ·Á¸é IDispatch¿Í COM ÀÚµ¿ÈÀÇ ³»¿ëÀ» ÀÚ¼¼È÷ Á¶»çÇØ¾ß ÇÒ ¼ö ÀÖ½À´Ï´Ù. C++¸¸À» »ç¿ëÇÏ¿© ExcelÀ» ÀÚµ¿ÈÇÏ´Â °£´ÜÇÑ Visual C++ 6.0 ÄÜ¼Ö ÀÀ¿ë ÇÁ·Î±×·¥À»
ÀÛ¼ºÇÏ·Á¸é ¾Æ·¡ÀÇ ´Ü°è¸¦ ¼öÇàÇϽʽÿÀ. - Visual C++ 6.0À» ½ÃÀÛÇϰí XlCpp¶ó´Â Win32 ÄÜ¼Ö ÀÀ¿ë ÇÁ·Î±×·¥À» »õ·Î ¸¸µì´Ï´Ù.
"Hello, World!" ÀÀ¿ë ÇÁ·Î±×·¥À» ¼±ÅÃÇϰí Finish¸¦ ´©¸¨´Ï´Ù.
- »ý¼ºµÈ 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;
}
- 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();
- ÄÄÆÄÀÏÇÏ°í ½ÇÇàÇÕ´Ï´Ù.
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
(http://support.microsoft.com/kb/196776/
)
Visual C++¸¦ »ç¿ëÇÑ Office ÀÚµ¿È
216388
(http://support.microsoft.com/kb/216388/
)
FILE: B2CSE.exe°¡ Visual Basic ÀÚµ¿È Äڵ带 Visual C++·Î º¯È¯ÇÑ´Ù
(c) Microsoft Corporation 1999, All Rights
Reserved. ±â°í: Joe Crump, Microsoft Corporation. Microsoft Á¦Ç° °ü·Ã ±â¼ú Àü¹®°¡µé°ú ¿Â¶óÀÎÀ¸·Î Á¤º¸¸¦ ±³È¯ÇϽ÷Á¸é Microsoft ´º½º ±×·ì
(http://support.microsoft.com/newsgroups/default.aspx)
¿¡ Âü¿©ÇϽñ⠹ٶø´Ï´Ù.±â¼ú ÀÚ·á: 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 |
°¨»çÇÕ´Ï´Ù! º¸³»ÁֽŠÀǰßÀº Áö¿ø ÄÜÅÙÃ÷¸¦ Çâ»ó½ÃŰ´Â µ¥ »ç¿ëµÉ °ÍÀÔ´Ï´Ù. ÀÚ¼¼ÇÑ Áö¿ø ¿É¼ÇÀ» º¸·Á¸é Microsoft °í°´Áö¿ø ȨÆäÀÌÁö¸¦ ¹æ¹®ÇØ Áֽñ⠹ٶø´Ï´Ù. | |