Internet Explorer 와 자원 관리자 창 만 들 기 및 자동화
57143 단어 internet
나 는 아주 오래 전부터 프로그램 으로 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 일 초판 발표
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
인터넷이란 무엇입니까? 데이터는 네트워크를 통해 어떻게 전송됩니까?웹은 인터넷에 액세스할 수 있는 많은 응용 프로그램 중 하나이며 웹 브라우저는 웹 페이지를 보고 다운로드할 수 있는 컴퓨터 프로그램일 뿐입니다. 인터넷은 분산된 네트워크 네트워크(컴퓨터)입니다. 연결된 각 컴퓨터에는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.