2008-09-25 3 views
1

이전에 Windows 레지스트리에 특정 MIME 유형을 등록하여 로컬로 설치된 도우미 응용 프로그램을 시작할 수있었습니다. 이를 통해 사용자는 내부 브라우저 응용 프로그램의 현재 설치 링크를 한 번 클릭 할 수 있습니다. 이것은 Internet Explorer 5 (대부분의 경우)와 Firefox에서 작동했지만 Internet Explorer 7에서는 작동하지 않습니다.등록 된 mime 도우미 응용 프로그램 시작

내 shell/open/command에 전달 된 파일 이름이 다운로드 한 설치 패키지의 전체 실제 경로가 아닙니다. . 내가 IE에 의해 건네하고 경로 매개 변수는 FileExists()를 호출 할 때 또는 TFileStream 객체를 생성 할 때이 불행하게도 실제 파일로 해결되지 않는

"C:\Document and Settings\chq-tomc\Local Settings\Temporary Internet Files\ 
    EIPortal_DEV_2_0_5_4[1].expd" 

입니다.

물리적 경로는 절대 경로

로 표현 될 것 "Content.IE5\ALBKHO3Q"의 임시 인터넷 파일의 인터넷 익스플로러 숨겨진 캐시 하위 디렉토리가 누락
"C:\Document and Settings\chq-tomc\Local Settings\Temporary Internet Files\ 
    Content.IE5\ALBKHO3Q\EIPortal_DEV_2_0_5_4[1].expd" 

예, 하위 디렉토리는 무작위로 IE에 의해 것을 생성 IE가 도우미 응용 프로그램의 전체 경로를 전달하는 한 걱정할 필요가 없습니다. 불행하게도 그렇게하지 않습니다.

mime 도우미 응용 프로그램 설치는 문제가되지 않습니다. 전 세계적으로 10,000 명이 넘는 모든 사용자를 대상으로 글로벌 로그인 스크립트로 설치/업데이트됩니다. mime 도우미는 사용자가 데스크톱 브라우저 응용 프로그램 설치 링크가있는 내부 웹 페이지를 클릭 할 때만 호출됩니다. 이 설치는 mime-type "application/x-expeditors"과 함께 제공됩니다. ".expd"/"application/x-expeditors" mime 유형의 등록은 다음과 같습니다.

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.expd] 
@="ExpeditorsInstaller" 
"Content Type"="application/x-expeditors" 

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ExpeditorsInstaller] 
"EditFlags"=hex:00,00,01,00 

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ExpeditorsInstaller\shell] 

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ExpeditorsInstaller\shell\open] 
@="" 

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ExpeditorsInstaller\shell\open\command] 
@="\"C:\\projects\\desktop2\\WebInstaller\\WebInstaller.exe\" \"%1\"" 

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type\application/x-expeditors] 
"Extension"=".expd" 

나는 사용자의 IE 캐시 항목을 모두 열거 고려했지만 나는 그들 모두를 조사하기 위해 취할 수 시간 또는 나는 내가 현재 항목 전에 이전 캐시 항목을 찾는 끝날 수 있다는 우려된다 찾고. 그러나 대괄호로 묶은 파일 이름 접미사 "[n]"은 고유 한 키일 수 있습니다.

나는 wininet 메서드 GetUrlCacheEntryInfo을 시도했지만 인터넷 경로가 아닌 IE에 의해 전달 된 가상 경로가 필요합니다.

내 희망은 가상 경로가 주어진 물리적 경로를 되돌려주는 쉘 기능입니다.

답변

0

일부 후속 조치를 통해이 질문을 마무리합니다.

TFileStream을 사용하여 파일 핸들을 만드는 방법이 진짜 문제였습니다. fmOpenRead 또는 fmShareDenyWrite으로 변경하여 파일 잠금 문제로 판명 된 사항을 해결했습니다.

srcFile := TFileStream.Create(physicalFilename, fmOpenRead or fmShareDenyWrite);
0

IE에서 만든 하위 디렉토리가 무작위로 생성되므로 매번 같은 이름이 될 수 있다고 보장 할 수 없으며 레지스트리 방법과 관련된 문제는 파일은 여전히 ​​캐시에 있습니다. 캐시를 비우면 다른 설치가 필요한 파일이 제거됩니다.

이 도우미를 응용 프로그램 데이터에 설치하는 것이 좋지 않겠습니까?

0

내가 이것에 대해 확실하지 않다 그러나 아마이 올바른 방향으로 당신을 이끌 수, FindFirstUrlCacheEntry 열거 FindNextUrlCacheEntry, FindCloseUrlCache을 당신이 항목을 찾을 때 그 로컬 파일 이름과 일치 : WinInet에의 DLL에서 URL 캐시 기능을 사용해보십시오 주어진 경로는 아마도 RetrieveUrlCacheEntryFile을 사용하여 파일을 검색 할 수 있습니다.

0

WAML 웹 응용 프로그램을 표시하기 위해 X-Appl 브라우저와 유사한 시스템을 사용하고 있으며 완벽하게 작동합니다. 어쩌면 어떻게 관리했는지 살펴 봐야 할 것입니다.

0

iexplore가 파일 시스템 이름 대신 파일의 쉘 이름 공간 "이름"을 전달하는 것처럼 보입니다.

익스플로러는 쉘 항목 ID를 명령 행에 전달할 수있는 문서화 된 방법이 없다고 생각합니다. 익스플로러는 그 자체로 처리하지만, 쉘 항목 ID는 이진 데이터 구조 만 (포인터)이므로 마샬링 고려 사항이 있습니다. 단일 프로세스에서 유효합니다.

내가 시도 할 수있는 것은 다음과 같습니다. 1. 쉘 네임 스페이스의 루트 IShellFolder 개체를 반환하는 SHGetDesktopFolder를 호출합니다. 2. IShellFolder :: ParseDisplayName을 호출하여 반환 된 이름을 셸 항목 ID 목록으로 바꿉니다. 3. SHGDN_FORPARSING 플래그를 사용하여 IShellFolder :: GetDisplayNameOF를 시도해보십시오. 솔직히 말해서 완전한 원으로 돌아가서 우리가 시작한 곳으로 돌아 왔습니다. 왜냐하면 나는이 API가 궁극적으로 "잘못된"파일 시스템 상대 경로를 반환 할 책임이 있다고 생각하기 때문입니다.

관련 문제