调用COM新建一个空白文档并加入链接

// AddHyperLinkViaCom.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 hr;
	CLSID wdCLSID;
	IDispatch *wdApp;
	hr =  OleInitialize(NULL);
	if(SUCCEEDED(hr)){
		CLSIDFromProgID(L"Word.Application",&wdCLSID);
		CoCreateInstance(wdCLSID,NULL,
		hr = CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER,IID_IDispatch,
		(void **)&wdApp);
		if(SUCCEEDED(hr)){
			VARIANT x;
			x.vt = VT_I4;
			x.lVal =1;
			hr = AutoWrap(DISPATCH_PROPERTYPUT,NULL,wdApp,L"Visible",1,x);
			if(SUCCEEDED(hr)){
				IDispatch *wdDocuments;
				VariantInit(&x);
				hr =  AutoWrap(DISPATCH_PROPERTYGET, &x, wdApp,L"Documents", 0);
				if(SUCCEEDED(hr)){
					wdDocuments = x.pdispVal;
					IDispatch * wdDocument;
					VariantInit(&x);
					VARIANT m;
					m.vt = VT_ERROR;
					m.lVal = (long)DISP_E_PARAMNOTFOUND;
					VARIANT F,T;
					F.vt = VT_BOOL;
					F.boolVal = false;
					T.vt = VT_BOOL;
					T.boolVal = true;
					//这里用DISPATCH_METHOD不能用DISPATCH_PROPERTYGET
					hr = AutoWrap(DISPATCH_METHOD,&x,wdDocuments,L"Add",4,
						T,m,F,m);
					if(SUCCEEDED(hr)){
						wdDocument = x.pdispVal;
						IDispatch * wdHyperLinks;
						IDispatch * wdRange;
						VariantInit(&x);
						hr =  AutoWrap(DISPATCH_PROPERTYGET, &x,wdDocument,
							L"HyperLinks",0);
						if(SUCCEEDED(hr)){
							wdHyperLinks = x.pdispVal;							
							hr =  AutoWrap(DISPATCH_METHOD,&x,wdDocument
								,L"Range",2,m,m);
							if(SUCCEEDED(hr)){
								wdRange = x.pdispVal;
								VariantInit(&x);
								VARIANT A,D,Ar;
								A.vt = VT_BSTR;
								A.bstrVal = 
									SysAllocString(L"http://www.google.com");
								D.vt = VT_BSTR;
								Ar.vt = VT_DISPATCH;
								Ar.pdispVal = wdRange;
								D.bstrVal = SysAllocString(L"google");
								hr = AutoWrap(DISPATCH_METHOD,&x,wdHyperLinks,
									L"Add",6,m,D,m,m,A,Ar);
								if(SUCCEEDED(hr)){
									printf("Add HyperLink successfully!\n");
								}
							}
						}
					}
				}
			}
		}
	}
	system("pause");
	CoUninitialize();
	return 0;
}

posted @ 2012-12-28 09:11  许阳 无锡  阅读(189)  评论(0编辑  收藏  举报