static BOOL test_EnumForms(struct torture_context *tctx, LPSTR servername, HANDLE handle) { DWORD levels[] = { 1, 2 }; DWORD success[] = { 1, 0 }; DWORD i; LPBYTE buffer = NULL; for (i=0; i < ARRAY_SIZE(levels); i++) { DWORD needed = 0; DWORD returned = 0; DWORD err = 0; char tmp[1024]; torture_comment(tctx, "Testing EnumForms level %d", levels[i]); EnumForms(handle, levels[i], NULL, 0, &needed, &returned); err = GetLastError(); if (err == ERROR_INSUFFICIENT_BUFFER) { err = 0; buffer = malloc(needed); torture_assert(tctx, buffer, "malloc failed"); if (!EnumForms(handle, levels[i], buffer, needed, &needed, &returned)) { err = GetLastError(); } } if (err) { sprintf(tmp, "EnumForms failed level %d on [%s] (buffer size = %d), error: %s\n", levels[i], servername, needed, errstr(err)); if (success[i]) { torture_fail(tctx, tmp); } else { torture_warning(tctx, tmp); } } free(buffer); buffer = NULL; } return TRUE; }
PFORM_INFO_1 GetFormsDatabase( HANDLE hPrinter, PDWORD pCount ) /*++ Routine Description: Return a collection of forms in the spooler database Arguments: hPrinter - Handle to a printer object pCount - Points to a variable for returning total number of forms Return Value: Pointer to an array of FORM_INFO_1 structures if successful NULL otherwise --*/ { PFORM_INFO_1 pFormDB = NULL; DWORD cbNeeded; if (!EnumForms(hPrinter, 1, NULL, 0, &cbNeeded, pCount) && GetLastError() == ERROR_INSUFFICIENT_BUFFER && (pFormDB = MemAlloc(cbNeeded)) != NULL && EnumForms(hPrinter, 1, (PBYTE) pFormDB, cbNeeded, &cbNeeded, pCount)) { return pFormDB; } MemFree(pFormDB); return NULL; }
void EnumDocument(IHTMLDocument2 *pIHTMLDocument2, HWND hWnd) { HRESULT hr; USES_CONVERSION; if(hWnd == NULL) hWnd = GetWindowHandle(pIHTMLDocument2); if (hWnd != NULL) { HWND hParentWnd = ::GetAncestor(hWnd, GA_ROOTOWNER); TCHAR lpCaption[MAX_PATH] = {0}; ::GetWindowText(hParentWnd, lpCaption, MAX_PATH); cout << _T("============") << hParentWnd << lpCaption << _T("============") << endl; } if (!pIHTMLDocument2) return; CComBSTR bstrTitle, bstrURL, bstrHTML; pIHTMLDocument2->get_title(&bstrTitle); //取得文档标题 pIHTMLDocument2->get_URL(&bstrURL); CComQIPtr <IHTMLElement> spBody; hr = pIHTMLDocument2->get_body(&spBody); if (FAILED(hr)) return; CComQIPtr <IHTMLElement> spHTML; hr = spBody->get_parentElement(&spHTML); if (FAILED(hr)) return; spHTML->get_outerHTML(&bstrHTML); cout << _T("Title: ") << (bstrTitle ? OLE2CT(bstrTitle) : _T("")) << endl; cout << _T("URL: ") << (bstrURL ? OLE2CT(bstrURL) : _T("")) << endl; // cout << _T("HTML: ") << (bstrHTML ? OLE2CT(bstrHTML) : _T("")) << endl; EnumForms(pIHTMLDocument2); EnumObjects(pIHTMLDocument2); EnumEmbeds(pIHTMLDocument2); EnumFrames(pIHTMLDocument2); }
BOOL bGetForms( HANDLE hPrinter, PRASDDUIINFO pRasdduiInfo /* Global Data Access */ ) { DWORD cbNeeded; /* Number of bytes needed */ DWORD cReturned; /* Number of forms returned */ FORM_INFO_1 *pForm; /* Scanning through returned data */ FORM_DATA *pFDTmp; /* Filling in FORM_DATA stuff */ /* * Standard technique: call first to determine how much storage * is required, allocate the storage and then call again. */ if( !EnumForms( hPrinter, 1, NULL, 0, &cbNeeded, &cReturned ) ) { if( GetLastError() == ERROR_INSUFFICIENT_BUFFER ) { if( pFIBase = (FORM_INFO_1 *)HEAPALLOC( pRasdduiInfo, 0, cbNeeded ) ) { if( EnumForms( hPrinter, 1, (LPBYTE)pFIBase, cbNeeded, &cbNeeded, &cReturned ) ) { /* * Allocate the number + 1 of structures needed to make * the FORM_DATA array. This is used elsewhere. */ cbNeeded = (cReturned + 1) * sizeof( FORM_DATA ); if( !(pFD = (FORM_DATA *)HEAPALLOC( pRasdduiInfo, 0, cbNeeded )) ) { vEndForms(pRasdduiInfo); /* Does the clean up */ return FALSE; } ZeroMemory( pFD, cbNeeded ); pForm = pFIBase; pFDTmp = pFD; pRasdduiInfo->cForms = cReturned; /* For setting defaults etc */ while( cReturned-- ) { /* * Have our structure point to the forms data, * and also convert the forms data base into * master units. */ XTOMASTER( pForm->Size.cx ); YTOMASTER( pForm->Size.cy ); pFDTmp->pFI = pForm++; ++pFDTmp; } } //If EnumForms fails, return false. else { RIP("Rasddui!bGetForms:2nd call to EnumForms Failed\n"); vEndForms(pRasdduiInfo); /* Does the clean up */ return FALSE; } return TRUE; /* AOK */ } } //If EnumForms fails, return false. else { RIP("Rasddui!bGetForms:EnumForms returns error other than ERROR_INSUFFICIENT_BUFFER\n"); vEndForms(pRasdduiInfo); /* Does the clean up */ return FALSE; } } RIP("Rasddui!bGetForms:1st call to EnumForms Failed\n"); /* * If we reach here, one of the above if(..) statements failed, * and that is NOT good. */ return FALSE; /* SHOULD NEVER HAPPEN */ }
BOOL EnumGeneric( IN PROC fnEnum, IN DWORD Level, IN PBYTE *ppEnumData, IN DWORD cbBuf, OUT LPDWORD pcbReturned, OUT LPDWORD pcReturned, IN PVOID Arg1, IN PVOID Arg2, IN PVOID Arg3 ) { BOOL rc; BOOL UnknownFunction = FALSE; DWORD cbRealloc; if( fnEnum == (PROC)EnumPrinters ) rc = EnumPrinters( (DWORD)Arg1, (LPTSTR)Arg2, COMMON_ARGS ); // Flags Name else if( fnEnum == (PROC)EnumJobs ) rc = EnumJobs( (HANDLE)Arg1, (DWORD)Arg2, (DWORD)Arg3, COMMON_ARGS ); // hPrinter FirstJob NoJobs else if( fnEnum == (PROC)EnumPrinterDrivers ) rc = EnumPrinterDrivers( (LPTSTR)Arg1, (LPTSTR)Arg2, COMMON_ARGS ); // pName pEnvironment else if( fnEnum == (PROC)EnumForms ) rc = EnumForms( (HANDLE)Arg1, COMMON_ARGS ); // hPrinter else if( fnEnum == (PROC)EnumMonitors ) rc = EnumMonitors( (LPTSTR)Arg1, COMMON_ARGS ); // pName else if( fnEnum == (PROC)EnumPorts ) rc = EnumPorts( (LPTSTR)Arg1, COMMON_ARGS ); // pName else if( fnEnum == (PROC)EnumPrintProcessors ) rc = EnumPrintProcessors( (LPTSTR)Arg1, (LPTSTR)Arg2, COMMON_ARGS ); // pName pEnvironment else if( fnEnum == (PROC)EnumPrintProcessorDatatypes ) rc = EnumPrintProcessorDatatypes( (LPTSTR)Arg1, (LPTSTR)Arg2, COMMON_ARGS ); // pName pPrintProcessorName else { *ppEnumData = NULL; UnknownFunction = TRUE; DBGMSG( DBG_ERROR, ( "EnumGeneric called with unknown function\n" ) ); rc = FALSE; } if( ( rc == FALSE ) && ( UnknownFunction == FALSE ) ) { if( GetLastError( ) == ERROR_INSUFFICIENT_BUFFER ) { cbRealloc = *pcbReturned; DBGMSG( DBG_TRACE, ( "EnumGeneric: Reallocating %d (0x%x) bytes @%08x\n", cbBuf, cbBuf, *ppEnumData ) ); if( cbBuf == 0 ) *ppEnumData = AllocSplMem( cbRealloc ); else *ppEnumData = ReallocSplMem( *ppEnumData, cbRealloc ); cbBuf = cbRealloc; if( *ppEnumData ) { DBGMSG( DBG_TRACE, ( "EnumGeneric: %d (0x%x) bytes reallocated @%08x\n", cbBuf, cbBuf, *ppEnumData ) ); if( fnEnum == (PROC)EnumPrinters ) rc = EnumPrinters( (DWORD)Arg1, (LPTSTR)Arg2, COMMON_ARGS ); // Flags Name else if( fnEnum == (PROC)EnumJobs ) rc = EnumJobs( (HANDLE)Arg1, (DWORD)Arg2, (DWORD)Arg3, COMMON_ARGS ); // hPrinter FirstJob NoJobs else if( fnEnum == (PROC)EnumPrinterDrivers ) rc = EnumPrinterDrivers( (LPTSTR)Arg1, (LPTSTR)Arg2, COMMON_ARGS ); // pName pEnvironment else if( fnEnum == (PROC)EnumForms ) rc = EnumForms( (HANDLE)Arg1, COMMON_ARGS ); // hPrinter else if( fnEnum == (PROC)EnumMonitors ) rc = EnumMonitors( (LPTSTR)Arg1, COMMON_ARGS ); // pName else if( fnEnum == (PROC)EnumPorts ) rc = EnumPorts( (LPTSTR)Arg1, COMMON_ARGS ); // pName else if( fnEnum == (PROC)EnumPrintProcessors ) rc = EnumPrintProcessors( (LPTSTR)Arg1, (LPTSTR)Arg2, COMMON_ARGS ); // pName pEnvironment else if( fnEnum == (PROC)EnumPrintProcessorDatatypes ) rc = EnumPrintProcessorDatatypes( (LPTSTR)Arg1, (LPTSTR)Arg2, COMMON_ARGS ); // pName pPrintProcessorName /* If things haven't worked out, free up the buffer. * We do this because otherwise the caller will not know * whether the pointer is valid any more, * since ReallocSplMem might have failed. */ if( rc == FALSE ) { if( *ppEnumData ) FreeSplMem( *ppEnumData ); *ppEnumData = NULL; *pcbReturned = 0; *pcReturned = 0; } /* Don't rely on pcbReturned having the same value * that was passed in: */ else *pcbReturned = cbRealloc; } } else { if( *ppEnumData ) FreeSplMem( *ppEnumData ); *ppEnumData = NULL; *pcbReturned = 0; *pcReturned = 0; rc = FALSE; } } else *pcbReturned = cbBuf; return rc; }