2013-10-18 5 views
0

this을 읽었으며 lpClass를 사용하여 "잘못된 파일 확장 문제"를 해결할 수 있음을 이해합니다. 그러나 다음 코드 줄을 읽을 때 실행 파일을 열 때 어떤 lpClass가 사용되는지 파악할 수 없습니다. lpVerb는 "개방"이고 lpFile 코드는 단순히 EXE를 실행 실행 exe 인 경우 lpClass없이ShellExecuteEx를 사용하여 실행 파일을 열고 lpClass도 지정합니까?

//code excerpt from foo.exe 
SHELLEXECUTEINFO info; 
ZeroMemory(&info, sizeof(SHELLEXECUTEINFO)); 
info.cbSize = sizeof(SHELLEXECUTEINFO); 
info.nShow = SW_NORMAL; 
info.lpVerb = L"open"; 
info.lpClass = L"ProgId Of foo.exe"; //what is this used for??? 
info.fMask = SEE_MASK_FLAG_LOG_USAGE | SEE_MASK_CLASSNAME;  
info.lpFile = L"bar.exe"; 
info.lpParameters = lpszParam; 
ShellExecuteEx(&info); 

가 지정된다. 하지만이 경우처럼 lpClass가 지정되면 어떻게 될까요?

답변

1

매개 변수 lpClass은 파일 형식의 progID 여야합니다. 그게 무슨 뜻 이죠?

수업을 통과하지 않으면 어떻게되는지 생각해보십시오.

  1. 현실에서는 셸 HKEY_CLASSES_ROOT\.htm 아래 레지스트리의 파일 확장자 (예를 들어, .htm)을 찾습니다 의미한다. 그런 다음 기본값 인 htmlfile을 확인합니다. (또한 다른 트릭을 사용하지만 대다수의 경우에는 확장 성을 결정하는 확장 기능입니다.)

  2. 다음으로 HKEY_CLASSES_ROOT\htmlfile을 조회하고 거기에있는 정보 (HKEY_CLASSES_ROOT\htmlfile\shell\open 아래)를 사용하여 파일 열기 방법을 결정합니다.

그래서 어떻게 lpClass을 사용합니까? 예를 들어 .TXT 파일이 있다고 가정하겠습니다. 실제로 html로 알고있는 경우 "htmlfile"lpclass 매개 변수로 전달할 수 있습니다. 이렇게하면 1 단계 (파일 찾기에서 클래스 찾기)를 건너 뛰고 2 단계로 바로 이동합니다. 이렇게하면 파일이 메모장 대신 브라우저에서 열립니다.

예에서는 "bar.exe"lpFile 매개 변수로 전달했습니다. "txtfile"lpClass으로 전달하면 bar.exe을 실행하는 대신 메모장에서 열어야합니다.

+0

ProgId는 파일 연결에 사용되지 않습니다. Foo.exe는 해당 ProgId와 COM 서버로 등록되어 있으며 progid는 bar.exe를 SHELLEXECUTEINFO의 lpClass 멤버로 호출하는 데 사용됩니다 ... COM에 대한 경험이 거의 없습니다. 죄송합니다. ProgId 발신자 ** foo.exe **와 관련됩니다. – kennyzx

+0

@kennyzx, 그건'ShellExecuteEx'가하는 것이 아닙니다. 당신은'CLSIDFromProgID'와'CoCreateInstance'를 원한다. COM 시스템은 올바르게 등록 된 경우 "bar.exe"를 시작합니다. – Ben