2011-10-06 33 views
0

在这些例子中,整个文档中,我想在ID打印的内容tab_form_1。而尝试这些 样本打印tab_form_1内容,lpOleCommandTarget成为同时查询NULL使用CComptr的接口。如何打印特定的内容使用DHTML

如何解决这个问题?

SAMMPLE

IHTMLDocument2 *pDoc; 
GetDHtmlDocument(&pDoc); 


CComPtr<IHTMLElement2> spControl;  
if(GetElementInterface(_T("tab_form_1") ,&spControl) != S_OK) 
    return; 

//ole command target 
LPOLECOMMANDTARGET lpOleCommandTarget = NULL; 
spControl->QueryInterface(IID_IOleCommandTarget,(void**)&lpOleCommandTarget);ASSERT(lpOleCommandTarget); 
//lpDispatch->Release(); 

if(lpOleCommandTarget == NULL) return; 

//prepare header 
CString header = _T("Project Path: &w"); 

VARIANT  header_variant; 
VariantInit(&header_variant); 
V_VT(&header_variant) = VT_BSTR; 
V_BSTR(&header_variant) = CString(header).AllocSysString(); 

//prepare footer 
CString footer = _T("&d &t&b Page&p of &P"); 

VARIANT  footer_variant; 
VariantInit(&footer_variant); 
V_VT(&footer_variant) = VT_BSTR; 
V_BSTR(&footer_variant) = CString(footer).AllocSysString(); 

//prepare header footer safe arrray 
SAFEARRAYBOUND parameter_array_bound[1]; 
SAFEARRAY  *parameter_array = NULL; 

parameter_array_bound[0].cElements = 2; 
parameter_array_bound[0].lLbound = 0; 

parameter_array = SafeArrayCreate(VT_VARIANT,1,parameter_array_bound); 

//HRESULT hr; 
long index; 

index = 0; 
HRESULT hr = SafeArrayPutElement(parameter_array,&index,&header_variant); 

index = 1; 
hr = SafeArrayPutElement(parameter_array,&index,&footer_variant); 

VARIANT parameter; 
VariantInit(&parameter); 
V_VT(&parameter) = VT_ARRAY | VT_BYREF; 
V_ARRAY(&parameter) = parameter_array; 

// print contents of web browser control 
lpOleCommandTarget->Exec(NULL, OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT, &parameter,NULL); 

//clear all variants 
VariantClear(&header_variant); 
VariantClear(&footer_variant); 
if (parameter_array != NULL) { 
    SafeArrayDestroy(parameter_array); 
} 

lpOleCommandTarget->Release(); 
+0

@karthik:如果我使用pDoc来查询接口,那么它将打印整个HTML文档。我的任务是打印该文档中特定ID的内容以打印。 – karthik

+0

@karthik:问题发生在这个地方:// ole命令目标 LPOLECOMMANDTARGET lpOleCommandTarget = NULL; spControl-> QueryInterface(IID_IOleCommandTarget,(void **)&lpOleCommandTarget); ASSERT(lpOleCommandTarget); – karthik

回答

0

试试这个sample.This将消除您的problem.This代码将打印特定的内容复制到新创建的文档。

// create DHtmlDocument for Newly Created Dialog 
HRESULT hDispatch = printdlg->m_pBrowserApp->get_Document((IDispatch**)&pDisp); 
if(hDispatch != S_OK) return; 
HRESULT hResult = pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pNewDoc); 
if(hResult != S_OK) return; 

//GetDHtmlDocument for new document 
GetDHtmlDocument(&pDoc); 

BSTR strSummaryText = GetElementHtml(L"tab_form_1"); 

// Creates a new one-dimensional array 
SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1); 
if (psaStrings == NULL) { 

    return; 
} 

VARIANT *param; 
HRESULT hresult = SafeArrayAccessData(psaStrings, (LPVOID*)&param); 
param->vt = VT_BSTR; 
param->bstrVal = strSummaryText; 

hresult = SafeArrayUnaccessData(psaStrings); 
//it will write the div part of tab_form_1 into new document to pass the summary contents alone to the printer 
hresult = pNewDoc->write(psaStrings); 


// SafeArrayDestroy calls SysFreeString for each strtemp 
if (psaStrings != NULL) { 
    SafeArrayDestroy(psaStrings); 
}