調用COM來實現在最後一個Worksheet後插一個新的Worksheet

// InsertAfterSheets.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, 
	LPOLESTR ptName, int cArgs...) {
	va_list marker;
	va_start(marker, cArgs);

	if(!pDisp) {
		_exit(0);
	}

	DISPPARAMS dp = { NULL, NULL, 0, 0 };
	DISPID dispidNamed = DISPID_PROPERTYPUT;
	DISPID dispID;
	HRESULT hr;
	char buf[200];
	char szName[200];

	WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);

	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);
		printf("%s\n",buf);
		_exit(0);
		return hr;
	}

	VARIANT *pArgs = new VARIANT[cArgs+1];
	for(int i=0; i<cArgs; i++) {
		pArgs[i] = va_arg(marker, VARIANT);
	}

	dp.cArgs = cArgs;
	dp.rgvarg = pArgs;

	if(autoType & DISPATCH_PROPERTYPUT) {
		dp.cNamedArgs = 1;
		dp.rgdispidNamedArgs = &dispidNamed;
	}
	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);
		printf("%s\n",buf);
		_exit(0);
		return hr;
	}
	va_end(marker);

	delete [] pArgs;

	return hr;
}

int _tmain(int argc, _TCHAR* argv[])
{
	HRESULT hresult;
	CLSID xlCLSID;
	IDispatch *xlApp;
	VARIANT pvResult;
	hresult = OleInitialize(NULL);
	if(SUCCEEDED(hresult)){
		CLSIDFromProgID(L"Excel.Application",&xlCLSID);
		hresult = CoCreateInstance(xlCLSID,NULL,
			CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER,
			IID_IDispatch,(void **)&xlApp);
		if(SUCCEEDED(hresult)){
			if(SUCCEEDED(hresult)){
				VARIANT x;
				x.vt = VT_I4;
				x.lVal =1;
				hresult = AutoWrap(DISPATCH_PROPERTYPUT,NULL,xlApp,L"Visible",1,
					x);
				if(SUCCEEDED(hresult)){
					printf("ddd\n");
					IDispatch *xlBooks;
					VariantInit(&pvResult);
					hresult =  AutoWrap(DISPATCH_PROPERTYGET, &pvResult, xlApp,
						L"Workbooks", 0);
					if(SUCCEEDED(hresult)){
						printf("ddsx\n");
						xlBooks = pvResult.pdispVal;
						IDispatch *xlBook;
						hresult = AutoWrap(DISPATCH_PROPERTYGET,&pvResult,
							xlBooks,L"Add",0);
						xlBook = pvResult.pdispVal;
						IDispatch *xlSheets;
						hresult = AutoWrap(DISPATCH_PROPERTYGET,&pvResult,
							xlBook,L"Sheets",0);
						xlSheets = pvResult.pdispVal;
						if(SUCCEEDED(hresult)){
							IDispatch *xlSheet;
							VARIANT p1;
							p1.vt = VT_INT;
							p1.intVal = 3;
							hresult = AutoWrap(DISPATCH_PROPERTYGET,&pvResult,
							xlSheets,L"Item",1,p1);
							xlSheet = pvResult.pdispVal;
							if(SUCCEEDED(hresult)){
								VARIANT m;
								m.vt = VT_ERROR;
								m.scode = DISP_E_PARAMNOTFOUND;
								hresult = AutoWrap(DISPATCH_PROPERTYGET,
									&pvResult,xlSheets,L"Add",4,m,m,pvResult,m);
								if(SUCCEEDED(hresult)){
									printf("Insert it after the last sheet");
								}
							}
						}
					}
				}
			}
		}
		else
			printf("No\n");
	}
	system("pause");
	CoUninitialize();
	return 0;
}

發佈了156 篇原創文章 · 獲贊 10 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章