2011-04-06 4 views
2

일부 시스템에서는 플러그인을 작성하고 있지만 Dll 초기화 (DllMain 또는 DllMain의 래퍼 인 InitInstance에서) 중에 플러그인을 호출하는 오작동 응용 프로그램이 있습니다.내 코드가 DllMain에서 실행 중인지 확인하는 방법은 무엇입니까?

코드가 DllMain에서 실행되는지 여부를 알아낼 방법이 있는지 궁금합니다. 교착 상태가 발생하지 않으면 서 정상적으로 실패하지 않을 것입니다. (플러그인이 실행되는 코드는 dll 로딩, 스레드 생성 및 이벤트 대기로 인해 DllMain에서 실행될 경우 교착 상태가 발생합니다.)

사실 DllMain이 종료 될 때까지 CreateThread가 실행되지 않는다는 것을 알고 있지만 COM이 포함되어 있으므로 다른 스레드에서 초기화를 수행 할 수 없습니다.

답변

0

사실 로더 잠금 상태를 들여다 볼 수있는 방법을 요구하고 있지만 Windows API는 어떤 방식 으로든 로더 잠금을 노출하지 않기 때문에 허용하지 않습니다. 잠금 상태를 얻을 수 있다고하더라도 후속 코드를 실행하는 동안 동일하게 유지된다는 보장을 할 수는 없습니다. 코드를 가져와야하고, 그 이유는 피하고자하는 일이기 때문에 전체 목적을 능가합니다 .

내가 볼 수있는 한,이 문제를 처리하는 유일한 방법은 플러그인을 문서화하고 DllMain()에서 사용을 금지하는 것입니다. 즉, 일부 구성 요소 소유자는 DLL 초기화를 약간 재 설계해야하므로 그렇게하십시오.

0

나는이 작업을 수행 할 수있는 시스템이 있다고 생각하지 않습니다. 그러나 로더 락은 한 번에 하나의 dllmain이 실행된다는 것을 보증하기 때문에 dllmain의 시작 부분에 플래그를 설정하고 끝에서 쉽게 설정을 해제 할 수 있습니다.

0

내가 이런 상황에 처했을 때 printf가 자르지 않으면 대신 파일을 만들려고합니다. 메시지를 파일 이름으로 타임 스탬프와 함께 사용하십시오. 이것은 행운을 빌면서 당신을 도울 것입니다.

0

이 문제를 감지 할 수있는 메커니즘이 없습니다. 모든 사람들은 규칙에 따라 행동해야합니다.

관련 문제