基本信息
源码名称:office 文档自动打印
源码大小:12.83M
文件格式:.rar
开发语言:C/C++
更新时间:2014-05-30
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍


HRESULT OLEMethod(int nType, VARIANT* pvResult, IDispatch* pDisp, LPOLESTR ptName, int cArgs...)

{
if(!pDisp)
{
return E_FAIL ;
}

va_list marker ;
va_start(marker, cArgs) ;

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

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

HRESULT hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID) ;
if(hr != S_OK)
{
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(nType & DISPATCH_PROPERTYPUT)
{
dp.cNamedArgs = 1 ;
dp.rgdispidNamedArgs = &dispidNamed ;
}

hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, nType, &dp, pvResult, NULL, NULL) ;
if(hr != S_OK)
{
return hr ;
}

va_end(marker) ;
delete[] pArgs ;
return hr ;

}


HRESULT AutoWordToPrint(LPOLESTR docName)
{
HRESULT hr = S_OK ;
CoInitialize(NULL) ;

IDispatch* pWordApp = NULL ;
IDispatch* pDocs = NULL ;
IDispatch* pDoc = NULL ;
IDispatch* pWordBasic = NULL ;

CLSID clsid ;
hr = CLSIDFromProgID(L"Word.Application", &clsid) ;
if(hr != S_OK)
{
goto EXIT ;
}

hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pWordApp) ;
if(hr != S_OK)
{
goto EXIT ;
}

//VARIANT vtVisible;
//vtVisible.vt = VT_I4;
//vtVisible.lVal = 1;
//hr = OLEMethod(DISPATCH_PROPERTYPUT, NULL, pWordApp, L"Visible", 1, vtVisible);

//if(FAILED(hr)) 
//{
// goto EXIT;
//}

VARIANT vtDocCollection ;
VariantInit(&vtDocCollection) ;
hr = OLEMethod(DISPATCH_PROPERTYGET, &vtDocCollection, pWordApp, L"Documents", 0) ;
if(hr != S_OK)
{
goto EXIT ;
}

pDocs = vtDocCollection.pdispVal ;

if(pDocs)
{
VARIANT vtResult ;
VariantInit(&vtResult) ;
VARIANT vNoParam ;
VariantInit(&vNoParam) ;
V_VT(&vNoParam) = VT_ERROR ;
V_ERROR(&vNoParam) = DISP_E_PARAMNOTFOUND ;
VARIANT vReadOnly ;
VariantInit(&vReadOnly) ;
V_VT(&vReadOnly) = VT_BOOL ;
V_BOOL(&vReadOnly) = VARIANT_TRUE ;

hr = OLEMethod(DISPATCH_METHOD, &vtResult, pDocs, L"Open", 3, vReadOnly, vNoParam, COleVariant(docName)) ;
if(hr != S_OK)
{
goto EXIT ;
}

pDoc = vtResult.pdispVal ;
if(pDoc)
{
LPOLESTR szPrintDoc = L"PrintOut" ;
DISPID dispPrintID ;

hr = pDoc->GetIDsOfNames(IID_NULL, &szPrintDoc, 1, LOCALE_USER_DEFAULT, &dispPrintID) ;
if(hr != S_OK)
{
goto EXIT ;
}

DISPPARAMS dpPrint = {NULL, NULL, 0, 0} ;
VARIANT vtRetVal ;
VariantInit(&vtRetVal) ;

hr = pDoc->Invoke(dispPrintID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dpPrint, &vtRetVal, NULL, NULL) ;
if(hr != S_OK)
{
goto EXIT ;
}
}
}

EXIT:
HRESULT hrClose = S_OK ;
HRESULT hrQuit = S_OK ;

if(pDoc)
{
VARIANT vtClose ;
vtClose.vt = VT_BOOL ;
vtClose.boolVal = false ;
hrClose = OLEMethod(DISPATCH_METHOD, NULL, pDoc, L"Close", 1, vtClose) ;
}

if(pWordApp)
{
hrQuit = OLEMethod(DISPATCH_METHOD, NULL, pWordApp, L"Quit", 0) ;
}

if(hrClose != S_OK)
{
hr = hrClose ;
}