문제

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

내 쉘/오픈/명령으로 전달 된 파일 이름은 다운로드 된 설치 패키지의 전체 물리적 경로가 아닙니다. IE에 의해 내가 건네 준 경로 매개 변수

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

불행히도 전화시 물리적 파일로 해결되지 않습니다. FileExists() 또는 만들려고 할 때 TFileStream 물체.

물리적 경로는 임시 인터넷 파일을위한 인터넷 익스플로러 숨겨진 캐싱 하위 디렉토리가 누락되었습니다. "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 도우미는 사용자가 데스크탑 브라우저 응용 프로그램을 설치하는 링크를 통해 내부 웹 페이지를 클릭 할 때만 호출됩니다. 그 설치는 마임 유형으로 다시 제공됩니다 "application/x-expeditors". 등록 ".expd" / "application/x-expeditors" 마임 타입은 이렇게 보인다.

[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가 넘겨 준 가상 경로가 아니라 URL이 필요합니다.

내 희망은 가상 경로가 주어지면 물리적 경로를 되돌릴 수있는 쉘 함수가 있기를 바랍니다.

도움이 되었습니까?

해결책 5

이 질문을 마무리하기위한 후속 조치.

실제 문제는 tfilestream을 사용하여 파일 핸들을 만드는 방법이었습니다. 나는 함께 열었다 fmopenread 또는 fmsharedenywrite 파일 잠금 문제로 판명 된 것을 해결했습니다.

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

다른 팁

IE에 의해 생성 된 하위 디렉토리가 무작위로 생성되었다고 생각하므로 매번 동일하게 명명 될 수 없으며 레지스트리 메소드에서 볼 수있는 문제는 파일이 여전히있을 때만 작동한다는 것입니다. 캐시에서 ... 캐시를 비우면 또 다른 설치가 필요한 파일이 제거됩니다.

이 헬퍼를 응용 프로그램 데이터에 설치하는 것이 더 좋지 않습니까?

나는 이것에 대해 잘 모르겠지만 아마도 이것은 당신을 올바른 방향으로 이끌 수 있습니다 : Wininet DLL에서 URL 캐시 함수를 사용해보십시오. findfirsturlcacheentry, FindNextUrlCacheentry, findcloseurlcache 열거와 로컬 파일 이름과 일치하는 항목을 찾을 때 주어진 경로를 찾을 수 있습니다. 검색어 릴 카시 젠트 리 파일 파일을 검색합니다.

X-APPL 브라우저와 유사한 시스템을 사용하여 WAML 웹 응용 프로그램을 표시하고 완벽하게 작동합니다. 어쩌면 당신은 그들이 어떻게 그것을했는지 살펴 봐야 할 것입니다.

ixplore가 파일 시스템 이름이 아닌 파일의 쉘 네임 스페이스 "이름"을 전달하는 것처럼 보입니다.

명령 줄에 쉘 항목 ID를 전달할 수있는 문서화 된 방법이 없다고 생각합니다. 탐색기는 스스로를 수행하지만 쉘 항목 ID가 (포인터) 단일에서만 유효한 이진 데이터 구조가 있기 때문에 마샬링 고려 사항이 있습니다. 프로세스.

내가 시도 할 수있는 것은 다음과 같습니다. 1. 쉘 네임 스페이스의 루트 iShellfolder 객체를 반환 할 ShgetDeskTopfolder에 전화하십시오. 2. iShellfolder :: parsedisplayName에 전화하여 쉘 항목 ID 목록으로 다시 주어진 이름을 돌립니다. 3. Shgdn_forparsing 플래그를 사용하여 iShellfolder :: getDisplayNameof를 사용해보십시오. 솔직히 말해서 W'eve가 완전한 원으로 갔고 우리가 시작한 곳으로 돌아온 것처럼 느껴집니다. 나는이 API가 궁극적으로 "잘못된"파일 시스템 상대 경로를 반환하는 데 책임이 있다고 생각하기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top