2013-10-15 2 views
1

VC++ 응용 프로그램에서 작업 대화 상자를 사용하고 싶습니다. TaskDialog 또는 TaskDialogIndirect를 사용하여 작업 대화 상자를 성공적으로 만들 수 있으며 Vista에서는 정상적으로 작동합니다. 그러나, 내 응용 프로그램이 Windows XP에서도 작동하도록하고 Windows XP는 작업 대화 상자를 지원하지 않기 때문에 OS가 XP 인 경우 대신 사용할 대화 상자를 만들었습니다. OS가 비스타 이상의 경우 : 표시 TaskDialog 다른 내 자신의 대화VC++ 응용 프로그램 - Windows XP 용 대체 기능이있는 TaskDialog 사용

이제 응용 프로그램이 여전히 윈도우 XP에서 작동하지 않습니다보기

그래서 내 코드는 같은 작업을 수행합니다. XP에서 응용 프로그램을 시작하려고하면 "ordinal 345를 동적 링크 라이브러리 comctl32.dll에 위치시킬 수 없습니다"라는 오류 메시지가 나타납니다. 이 호출은 if 블록에 있지만 TaskDialogIndirect에 대한 호출이 내 코드에 있기 때문에 가능합니다. 응용 프로그램을로드하는 동안 comctl32.dll에서 함수를 찾으려고 시도하지만 dll의 XP 버전이므로 찾지 못합니다.

그래서 제 질문은 :

나는 그것이 XP와 비스타 모두에서 성공적으로 실행되도록 내 응용 프로그램을 코딩하고, XP의 경우 비스타의 경우 반면에 내 자신의 대화 상자를 표시하고 더 높은 작업을 보여 어떻게 대화?

답변

1

문제는 응용 프로그램이 응용 프로그램 시작시 OS 로더가 해결하려고하는 종속성 인 해당 기능에 대한 종속성이 있다는 것입니다. 물론 XP에 이러한 기능이 없으므로 실행 파일이로드되지 않습니다.

두 가지 방법이 있습니다. 먼저 delay-loading comctl32.dll을 시도하십시오. 이렇게하면로드 시간 종속성이 제거되고 함수가 실제로 호출 될 때까지 해결이 지연됩니다. 그렇다면 지원되지 않는 곳으로 전화하지 않도록 조심해야합니다.

그래도 작동하지 않으면 LoadLibraryGetProcAddress을 통해 TaskDialog에 명시 적으로 바인딩해야합니다. 이렇게하면 링커가 알 수있는 방식으로 함수를 명시 적으로 언급하지 않으므로로드 시간 의존성을 사용하지 않아도됩니다. 함수 포인터를 사용하여 좀 더 많은 작업을 수행 할 수 있습니다.

관련 문제