Internet Explorer 와 자원 관리자 창 만 들 기 및 자동화

57143 단어 internet
  • 예제 프로젝트 다운로드 - 34 Kb


  • 나 는 아주 오래 전부터 프로그램 으로 Shell 창 을 자동화 하기 시작 했다. 주요 대상 은 IE 창 이 었 다.때때로 브 라 우 저 컨트롤 이나 MFC 류 CHTMLview 는 나의 수 요 를 만족 시 킬 수 있 지만, 많은 경우 에 나 는 처음부터 브 라 우 저 컨트롤 을 삽입 하고 가능 한 한 IE 의 행동 을 모 의 해 야 한다. 예 를 들 어 실현 IDocHostUIHandler 을 통 해 사용 자동 완성 기능 을 사용 해 야 한다.IE 창 을 직접 조작 하 는 것 이 자 연 스 러 운 대안 이다.
    새 Internet Explorer 창 만 들 기
    가장 쉬 운 방법 은 Windows API ShellExecute (Ex) 를 호출 하 는 것 입 니 다. Paul DiLascia 는 그의 C + Q & A 칼럼 'Browser Detection Revisited, Toolbar Info, IUnknown with COM and MFC' 에 예제 코드 가 있 습 니 다.
    
       
       
    <!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> /**/ /// As I've shown in many programs... ShellExecute( 0 , _T( " open " ), pszMyHTMLFile, 0 , 0 , SW_SHOWNORMAL);
    하지만 새 창 을 제어 할 수 없고 사용자 가 프로그램 을 닫 은 후에 IE 창 을 남 깁 니 다.내 문 앞의 눈 을 쓸 기 위해 서 는 내 가 만 든 창 을 찾 아 제어 해 야 한다.
    나의 다음 시 도 는 하 나 를 만 들 고 제어 하 는 것 Internet Explorer 대상 이 며 필요 할 때 끄 는 것 이다.마이크로소프트 지식 창고 에 'How To Automate Internet Explorer to POST Form Data' 라 는 글 이 있 습 니 다. 기본적으로 제 가 원 하 는 것 은 마지막 으로 창 을 닫 는 것 을 제외 하고 제 가 원 하 는 것 입 니 다.응, 간단 한 호출 IWebBrowser2::Quit 이면 이 정 도 는 할 수 있어.
    
       
       
    <!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> // create a new IE instance and show it // CComQIPtr m_pWebBrowser2; m_pWebBrowser2.CoCreateInstance(CLSID_InternetExplorer); HRESULT hr; hr = m_pWebBrowser2 -> put_StatusBar(VARIANT_TRUE); hr = m_pWebBrowser2 -> put_ToolBar(VARIANT_TRUE); hr = m_pWebBrowser2 -> put_MenuBar(VARIANT_TRUE); hr = m_pWebBrowser2 -> put_Visible(VARIANT_TRUE); if ( ! ::PathIsURL(m_strFileToFind)) m_strFileToFind = _T( " http://blog.joycode.com/jiangsheng " ); COleVariant vaURL( ( LPCTSTR) m_strFileToFind); m_pWebBrowser2 -> Navigate2( & vaURL, COleVariant( ( long ) 0 , VT_I4), COleVariant((LPCTSTR)NULL, VT_BSTR), COleSafeArray(), COleVariant((LPCTSTR)NULL, VT_BSTR) ); void CAutomationDlg::OnDestroy() ... { //close the IE window created by this program before exit if(m_pWebBrowser2) ...{ if(m_bOwnIE) ...{ m_pWebBrowser2->Quit(); m_bOwnIE=FALSE; } UnadvisesinkIE(); m_pWebBrowser2=(LPUNKNOWN)NULL; } CDialog::OnDestroy(); }
    또 한 가지 질문 이 있 습 니 다.사용자 가 나의 WM 에 있다 면TIMER 처리 함수 에서 창 을 조작 하기 전에 새로운 IE 창 을 끄 면 어떻게 합 니까?IWebBrowser 2 인 터 페 이 스 를 제어 할 수 있 는 IE 대상 은 이제 존재 하지 않 습 니 다.다행히 마이크로소프트 는 이 점 을 고려 하여 프로그램 이 무 너 지지 않 을 것 이다. 그러나 언제 꺼 질 지 알 수 있 는 것 이 좋 겠 다. 그러면 나 는 의외 의 발생 을 피 할 수 있다.
    Internet Explorer 이벤트 처리
    Internet Explorer 대상 은 종료 시 터치 DWebBrowserEvents2::OnQuit 이벤트 합 니 다.이것 은 이상 적 인 석방 통제 의 시기 다.대상 이 소각 되 어야 하기 때문에 나 는 동시에 대상 의 사건 을 감시 하 는 것 도 멈 추 었 다.
    
      
      
    <!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> if (m_pWebBrowser2) ... { UnadvisesinkIE(); m_pWebBrowser2=(LPUNKNOWN)NULL; }
    현재 Internet Explorer 창 에 연결
    비록 나 는 내 가 어떤 IE 창 을 제어 하 는 지 는 개의 치 않 지만 마이크로소프트 지식 창고 에 '어떻게 인터넷 익스플로러 에 연결 하 는 실례' 라 는 글 이 있 는 이상 일부 사람들 이 '현재 의 Internet Explorer 인 스 턴 스 에 어떻게 연결 하 는 지' 라 는 글 이 비교적 유용 하 다 고 가정 할 것 이다.
    그렇다면 '현재 인터넷 익스플로러 인 스 턴 스' 는 무엇 입 니까?실제로 마지막 으로 활동 하 는 IE 창 이다.윈도 우 는 활성 화 된 창 을 z - order 의 맨 위로 이동 하기 때문에 모든 IE 창의 z - order 의 가장 높 은 곳 에 보관 합 니 다.그래서 내 가 해 야 할 일 은 어떤 IE 창 이 가장 높 은 z - order 값 을 가지 고 있 는 지 찾 는 것 이다.이렇게 하면 나 는 어느 창 이 IE 창 인지 먼저 판단 해 야 한다.Spy++ 와 관련 된 조 사 를 한 후에 IE 창 에 공 통 된 창 클래스 인 'IEFrame' 이 있다 고 가정 한 다음 에 Shell 창의 창 클래스 를 얻 기 위해 함 수 를 작 성 했 습 니 다.
    
       
       
    <!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> // shell windows object will list both IE and Explorer windows // use their window class names to identify them. CString CAutomationDlg::GetWindowClassName(IWebBrowser2 * pwb) ... { TCHAR szClassName[_MAX_PATH]; ZeroMemory( szClassName, _MAX_PATH * sizeof( TCHAR)); HWND hwnd=NULL; if (pwb) ...{ LONG_PTR lwnd=NULL; pwb->get_HWND(&lwnd); hwnd=reinterpret_cast(lwnd); ::GetClassName( hwnd, szClassName, _MAX_PATH); } return szClassName; }
    남 은 문 제 는 간단 합 니 다. Z 축 을 따라 맨 위 창 을 매 거 하고 첫 번 째 Shell 창 목록 에 있 는 창 류 'IEFrame' 이 있 는 첫 번 째 인 스 턴 스 를 찾 습 니 다.그 후에 저 는 IE 의 DHTML 문서 대상 모델 (DOM 이 라 고도 부 릅 니 다. IE 창 에서 마지막 DocumentComplete 이 벤트 를 실행 한 후에 만 유효 합 니 다) 을 조작 하여 창 에 성공 적 으로 연결 되 었 는 지 확인 하 였 습 니 다.
    
      
      
    <!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> void CAutomationDlg::DocumentComplete(IDispatch * pDisp, VARIANT * URL) ... { //HTML DOM is available AFTER the DocumentComplete event is fired. //For more information, please visit KB article //"How To Determine When a Page Is Done Loading in WebBrowser Control" //http://support.microsoft.com/kb/q180366/ CComQIPtr pWBUK(m_pWebBrowser2); CComQIPtr pSenderUK( pDisp); USES_CONVERSION; TRACE( _T( "Page downloading complete:/r/n")); CComBSTR bstrName; m_pWebBrowser2->get_LocationName(&bstrName); CComBSTR bstrURL; m_pWebBrowser2->get_LocationURL(&bstrURL); TRACE( _T( "Name:[ %s ]/r/nURL: [ %s ]/r/n"), OLE2T(bstrName), OLE2T(bstrURL)); if (pWBUK== pSenderUK) ...{ CComQIPtr pHTMLDocDisp; m_pWebBrowser2->get_Document(&pHTMLDocDisp); CComQIPtr pHTMLDoc(pHTMLDocDisp); CComQIPtr ecAll; CComPtr pTagLineDisp; if(pHTMLDoc) ...{ CComBSTR bstrNewTitle(_T("Sheng Jiang's Automation Test")); pHTMLDoc->put_title(bstrNewTitle); pHTMLDoc->get_all(&ecAll); } if(ecAll) ...{ ecAll->item(COleVariant(_T("tagline")),COleVariant((long)0),&pTagLineDisp); } CComQIPtr eTagLine(pTagLineDisp); if(eTagLine) ...{ eTagLine->put_innerText( CComBSTR(_T("Command what is yours, conquer what is not. --Kane"))); } } }
    현재 제어 창 은 IE 가 파일 을 열 때 선택 한 것 과 같 습 니 다.
    부산물: 현재 Windows 탐색 기 창 에 연결
    ShellWindows 대상 의 셸 창 목록 을 연구 할 때 저 는 부산물 을 얻 었 습 니 다. Windows 탐색 기 창 에 도 공 통 된 창 유형 이 있 는 것 같 습 니 다.이러한 똑 같은 메커니즘 은 창 류 를 'IEFrame' 에서 'ExploreWClass' 로 바 꾼 후에 Windows Explorer 창 에 도 적용 된다.DHTML DOM 이 작 동 할 수 없 기 때문에 Windows 탐색 기 창 에 기 존 경 로 를 열 어 내 가 이 창 을 인수 했다 는 것 을 표시 하 라 고 알 렸 습 니 다.
    
       
       
    <!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> // show the folder bar COleVariant clsIDFolderBar(_T( " {EFA24E64-B078-11d0-89E4-00C04FC9E26E} " )); COleVariant FolderBarShow(VARIANT_TRUE,VT_BOOL); COleVariant dummy; if (m_pWebBrowser2) m_pWebBrowser2 -> ShowBrowserBar( & clsIDFolderBar, & FolderBarShow, & dummy); // browse to a given folder CComQIPtr psp(m_pWebBrowser2); CComPtr psb; if (psp) psp -> QueryService(SID_STopLevelBrowser,IID_IShellBrowser,(LPVOID * ) & psb); if (psb) ... { USES_CONVERSION; LPITEMIDLIST pidl=NULL; SFGAOF sfgao; SHParseDisplayName (T2OLE(m_strFileToFind),NULL,&pidl,0, &sfgao); if(pidl==NULL) ::SHGetSpecialFolderLocation(m_hWnd,CSIDL_DRIVES,&pidl); m_pidlToNavigate=NULL; if(pidl) ...{ //if the start address is a folder, then browse it. //otherwise browse to its parent folder, and select it in the folder view. LPCITEMIDLIST pidlChild=NULL; CComPtr psf; HRESULT hr = SHBindToParent(pidl, IID_IShellFolder, (LPVOID*)&psf, &pidlChild); if (SUCCEEDED(hr))...{ SFGAOF rgfInOut=SFGAO_FOLDER; hr=psf->GetAttributesOf(1,&pidlChild,&rgfInOut); if (SUCCEEDED(hr))...{ m_pidlToNavigate=ILClone(pidl); if(rgfInOut&SFGAO_FOLDER)...{//this is a folder psb->BrowseObject(pidl,SBSP_SAMEBROWSER); } else ...{ //this is a file, browse to the parent folder LPITEMIDLIST pidlParent=ILClone(pidl); ::ILRemoveLastID(pidlParent); psb->BrowseObject( pidlParent, SBSP_SAMEBROWSER); ILFree(pidlParent); } } } //clean up ILFree(pidl); } } :
    이 코드 는 파일 과 폴 더 를 구별 하고 싶 어서 좀 깁 니 다.만약 당신 이 IShellBrowser::BrowseObject 을 호출 하고 이 방법 에 파일 pidl 을 전달한다 면, 윈도 탐색 기 는 자원 관리자 의 주소 표시 줄 에 경 로 를 입력 한 후에 리 턴 을 누 르 는 것 처럼 이 파일 을 열 수 있 는 지 여 부 를 알려 줄 것 입 니 다."Explorer. exe/select"의 행동 을 모 의 하고 싶 습 니 다. 폴 더 보기에 서 지정 한 파일 을 선택 하 였 습 니 다. 그래서 저 는 DocumentComplete 이벤트 처리 함수 에 코드 를 추가 하 였 습 니 다.
    
      
      
    <!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> if (m_pidlToNavigate) ... { //If the start address is a file, browse to the parent folder //and then select it CComQIPtr psp(m_pWebBrowser2); CComPtr psb; CComPtr psv; if(psp) psp->QueryService(SID_STopLevelBrowser,IID_IShellBrowser,(LPVOID*)&psb); if(psb) psb->QueryActiveShellView(&psv); if(psv) ...{ LPCITEMIDLIST pidlChild=NULL; CComPtr psf; SFGAOF rgfInOut=SHCIDS_ALLFIELDS; HRESULT hr = SHBindToParent(m_pidlToNavigate, IID_IShellFolder, (LPVOID*)&psf, &pidlChild); if (SUCCEEDED(hr))...{ hr=psf->GetAttributesOf(1,&pidlChild,&rgfInOut); if (SUCCEEDED(hr))...{ if((rgfInOut&SFGAO_FOLDER)==0)...{ //a file, select it hr=psv->SelectItem(ILFindLastID(m_pidlToNavigate) ,SVSI_SELECT|SVSI_ENSUREVISIBLE|SVSI_FOCUSED| SVSI_POSITIONITEM); } } } } //clean up ILFree(m_pidlToNavigate); m_pidlToNavigate=NULL; }
    탐색 기 창 만 들 기
    이렇게 많은 문 제 를 해결 하 였 으 니 금의환향 할 수 있다.현재 Internet Explorer 창 과 기본적으로 같은 방식 으로 현재 Windows 탐색 기 창 에 연결 할 수 있 으 니 Internet Explorer 창 을 만 드 는 것 과 기본적으로 같은 방식 으로 Windows 탐색 기 창 을 만 들 수 있 습 니까?유감스럽게도 이것 은 안 된다.윈도 우즈 탐색 기 에 대응 하 는 클래스 ID 가 존재 하지 않 습 니 다. COM 대상 을 만 듭 니 다.IE 창 을 만 들 고 폴 더 를 탐색 하 며 폴 더 사 이 드 바 를 표시 하여 Windows 탐색 기 창 처럼 보일 수 있 지만 창 류 'IEFrame' 을 바 꿀 수 없 기 때문에 HTML 페이지 와 활성 문 서 를 표시 하 는 다른 IE 창 과 구분 하기 어렵 습 니 다.
    좋아, 내 가 COM 방식 으로 그것 을 만 들 수 없 으 니 전통 적 인 방식 으로 도 시도 해 볼 수 있어.explorer. exe 프로 세 스 를 만 든 후에 메 인 창 을 찾 을 수 있 습 니 다. Paul DiLascia 가 그의 글 'Get the Main Window, Get EXE Name' 에서 보 여 준 것 처럼 문서 화 되 지 않 은 메시지 WM_GETISHELLBROWSER 를 보 내 창의 IShellBrowser 인 터 페 이 스 를 얻 을 수 있 습 니 다.
    
       
       
    <!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> // start the new process STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( & si, sizeof (si) ); si.cb = sizeof (si); ZeroMemory( & pi, sizeof (pi) ); // Start the child process. if ( ! CreateProcess( NULL, // No module name (use command line). _T( " explorer.exe " ), // Command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. 0 , // No creation flags. NULL, // Use parent's environment block. NULL, // Use parent's starting directory. & si, // Pointer to STARTUPINFO structure. & pi ) // Pointer to PROCESS_INFORMATION structure. ) // wait a graceful time // so the window is created and is ready to answer messages. ::WaitForInputIdle(pi.hProcess, 1000 ); // m_hExplorerProcess=(DWORD)pi.hProcess; EnumWindows(EnumWindowsProc,(LPARAM) this ); BOOL CALLBACK CAutomationDlg::EnumWindowsProc(HWND hwnd,LPARAM lParam) ... { CAutomationDlg* pdlg=(CAutomationDlg*)lParam; DWORD pidwin; GetWindowThreadProcessId(hwnd, &pidwin); if (pidwin==pdlg->m_hExplorerProcess) ...{ IShellBrowser* psb=(IShellBrowser*)::SendMessage(hwnd,WM_USER+7,0,0); CComQIPtr pwb(psb); return FALSE; } return TRUE; }
    아, 이 건 내 컴퓨터 에서 도 효과 가 없어.어떻게 된 거 야?내 자원 관리자 의 폴 더 옵션 에서 "같은 창 에서 모든 폴 더 를 엽 니 다"가 선택 되 었 기 때문에 새로운 Windows 탐색 기 창 은 기 존의 Windows 탐색 기 프로 세 스에 서 만 들 어 졌 습 니 다.보아하니 이것 은 막 다른 골목 인 것 같다.
    잠시 만 요. 제 수중 에 또 다른 ShellWindows 대상 이 있 습 니 다. Shell 창의 목록 을 주 실 수 있 습 니 다. 모든 Windows 탐색 기 창 과 모든 창 에 대응 하 는 IWebBrowser 2 인 터 페 이 스 를 포함 합 니 다. 이것 은 IShellBrowser 인터페이스 로 가 는 입구 입 니 다.현재 셸 창 목록 두 개 를 가 져 와 야 합 니 다. explorer. exe 프로 세 스 를 만 들 기 전과 그 다음 에 각각 한 개 씩 비교 해서 새로운 셸 창 을 찾 아야 합 니 다.
    
      
      
    <!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> m_pShellWindows.CoCreateInstance(CLSID_ShellWindows); if (m_pShellWindows) ... { //get the list of running IE windows //using the ShellWindows collection //For more information, please visit //http://support.microsoft.com/kb/176792 long lCount=0; m_pShellWindows->get_Count(&lCount); for(long i=0;i pdispShellWindow; m_pShellWindows->Item(COleVariant(i),&pdispShellWindow); if(pdispShellWindow) ...{ m_listShellWindows.AddTail(new CComQIPtrIDispatch(pdispShellWindow)); } } } // enumerate through the new shell window list long lCount = 0 ; m_pShellWindows -> get_Count( & lCount); for ( long i = 0 ;i // search the new window // using the ShellWindows collection // For more information, please visit // http://support.microsoft.com/kb/176792 BOOL bFound = FALSE; CComPtr pdispShellWindow; m_pShellWindows -> Item(COleVariant(i), & pdispShellWindow); // search it in the old shell window list POSITION pos = m_listShellWindows.GetHeadPosition(); while (pos) ... { CComQIPtrIDispatch* pDispatch=m_listShellWindows.GetNext(pos); if(pDispatch&&pdispShellWindow.p==pDispatch->p) ...{ bFound=TRUE;break; } } if ( ! bFound) // new window found ... { //attach to it m_pWebBrowser2=pdispShellWindow; m_bOwnIE=TRUE; //sink for the Quit and DocumentComplete events AdviseSinkIE(); NavigateToSamplePage(FALSE); } }
    잠시 만 요. "explorer. exe 프로 세 스 를 만 든 후"는 무슨 뜻 입 니까?1 초 뒤에?아니면 2 초?실제로 Window Registered 이 벤트 는 ShellWindows 대상 에 의 해 실 행 됩 니 다. 그래서 저 는 이벤트 처리 에 코드 를 추가 합 니 다.
    
       
       
    <!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> // sink DShellWindowsEvents events LPUNKNOWN pUnkSink = GetIDispatch(FALSE); m_pShellWindows.CoCreateInstance(CLSID_ShellWindows); AfxConnectionAdvise((LPUNKNOWN)m_pShellWindows, DIID_DShellWindowsEvents,pUnkSink,FALSE, & m_dwCookieShellWindows); void CAutomationDlg::WindowRegistered( long lCookie) ... { //ok, a new shell window is created if(m_pShellWindows) ...{ //enumerate through the new shell window list long lCount=0; m_pShellWindows->get_Count(&lCount); for(long i=0;i//search the new window //using the ShellWindows collection //For more information, please visit //http://support.microsoft.com/kb/176792 BOOL bFound=FALSE; CComPtr pdispShellWindow; m_pShellWindows->Item(COleVariant(i),&pdispShellWindow); //search it in the old shell window list POSITION pos=m_listShellWindows.GetHeadPosition(); while(pos) ...{ CComQIPtrIDispatch* pDispatch=m_listShellWindows.GetNext(pos); if(pDispatch&&pdispShellWindow.p==pDispatch->p) ...{ bFound=TRUE;break; } } if(!bFound)//new window ...{ //attach to it m_pWebBrowser2=pdispShellWindow; m_bOwnIE=TRUE; //sink for the Quit and DocumentComplete events AdviseSinkIE(); NavigateToSamplePage(FALSE); } } //clean up if(m_dwCookieShellWindows!= 0) ...{ LPUNKNOWN pUnkSink = GetIDispatch(FALSE); AfxConnectionUnadvise((LPUNKNOWN)m_pShellWindows, DIID_DShellWindowsEvents, pUnkSink, FALSE, m_dwCookieShellWindows); m_dwCookieShellWindows= 0; } POSITION pos=m_listShellWindows.GetHeadPosition(); while(pos) ...{ CComQIPtrIDispatch* pDispatch=m_listShellWindows.GetNext(pos); delete pDispatch; } m_listShellWindows.RemoveAll(); m_pShellWindows=(LPUNKNOWN)NULL; } }
    왜 Browser Helper Objects 를 사용 하지 않 습 니까?
    새 창 이 프로 세 스 밖 에 있 기 때문에 크로스 프로 세 스 열 집합 COM 호출 이 느 립 니 다.자동화 작업 에 COM 호출 이 많이 포함 되 어 있다 면 브 라 우 저 보조 대상 BHO 을 만 드 는 등 코드 를 현지 화 할 수 있 습 니 다.그러나 BHO 는 모든 Windows Explorer 와 Internet Explorer 의 인 스 턴 스 에 의 해 불 러 옵 니 다. 그리고 시스템 전 체 를 늦 추어 서 기와 에 서 리 를 쓸 게 하고 싶 지 않 습 니 다.일부 사람들 은 오히려 이 기술 을 사용 했다 현재 Internet Explorer 창 에 연결.
    기지 문제
    ShellWindows 대상 은 explorer. exe process 가 종료 되 거나 시작 되 지 않 았 을 때 접근 할 수 없습니다.BHO 는 이 경우 대안 으로 활용 할 수 있다.
    결론.
    여기 에는 사람 을 헷 갈 리 게 하 는 코드 가 많 고 익숙 하지 않 은 COM 과 Windows API 함수 가 혼합 되 어 있 을 수도 있 습 니 다.당신 이 본문 이 유용 하고 나의 코드 에 의 해 머리 가 어 지 럽 지 않 기 를 바 랍 니 다.자동 화 된 Internet Explorer 와 Windows Explorer 창 은 시스템 의 기본 행동 을 모 의 하 는 시간 을 절약 하고 사용자 에 게 익숙 한 화면 을 제공 할 수 있 습 니 다.
    레 퍼 런 스
  • Browser Detection Revisited, Toolbar Info, IUnknown with COM and MFC
  • Connecting to Running Instances of Internet Explorer
  • Connecting to a running instance of Internet Explorer
  • Get the Main Window, Get EXE Name
  • How to connect to a running instance of Internet Explorer
  • How to Connect to IExplorer in Citrix Environments
  • PRB: IShellFolder::CreateViewObject() causes access violation
  • Querying information from an Explorer window
  • ShellWindows Object (Windows Explorer and Controls)

  • 역사.
  • 2005 년 10 월 20 일 초판 발표
  • 좋은 웹페이지 즐겨찾기