도입을 수정하는 것입니다 - 길고 지루한 부분
(질문은 끝입니다)타사 코드는 FPU 제어 단어를
내가 얻고 심한 머리를 유지하는 타사 COM 구성 요소를 통해 아파 FPU 제어 워드 변경.
내 개발 환경은 Windows 및 Visual C++ 2008입니다. 일반 FPU 제어 단어는 다양한 조건에서 예외를 throw하지 않아야 함을 지정합니다. 나는 float.h
에있는 _CW_DEFAULT
매크로를보고 시작할 때 디버거의 제어 단어를보고 확인했다.
COM 개체를 호출 할 때마다 컨트롤 단어가 반환 될 때마다 수정됩니다. 이것은 방어하기 쉽습니다. 나는 단순히 제어 단어를 재설정하고 모두 좋다. 문제는 COM 구성 요소가 내 이벤트 싱크를 호출하기 시작할 때입니다. 이벤트 호출을 받자 마자 제어 단어를 다시 설정하여 코드를 보호 할 수는 있지만 이벤트 호출에서 복귀하자 마자 아무 것도 할 수 없습니다.
이 COM 구성 요소에 대한 원본이 없지만 저자와 연락 중입니다. 내가 그에게서받은 반응은 "어?"였습니다. 나는 그가 내가 말하는 것에 대해 조금이라도 단서가 없다고 생각한다. 그래서 나는 이것에 대해 무언가를해야한다는 것을 두려워한다. 나는 그의 런타임 (DLL이 심볼 이름으로 가득 차 있기 때문에 델파이 또는 볼랜드 C++이라고 생각한다), 또는 그가 사용하고있는 다른 제 3 자 코드가 문제를 일으키는 것으로 생각한다. 저는 그의 코드가 FPU 제어 단어를 명시 적으로 수정하지 않았다고 생각합니다.
그럼 어떻게해야합니까? 비즈니스 관점에서 볼 때이 타사 구성 요소를 사용해야합니다. 기술적 인 관점에서 볼 때, 나는 그것을 버리고 통신의 프로토콜을 직접 구현할 수 있습니다. 그러나이 프로토콜은 신용 카드 거래를 처리하기 때문에 비용이 많이 듭니다. 우리는 책임을지지 않기를 원합니다.
필자는 컴포넌트 작성자에게 전달할 수있는 Borland 제품의 FPU 설정에 관한 유용한 정보 나 해킹이 절실히 필요합니다. 내가 할 수있는 일 는
질문
있습니까? 나는 구성 요소 작성자가 그것을 고치기 위해 무엇을 가지고 있다고 생각하지 않는다. (오히려 우둔한 대답으로 판단함으로써).
나는 처리기에서 제어 단어를 재설정하고 Windows에서 계속 실행하도록 내 자신의 예외 처리기를 설치한다는 생각에 놀랐다. SetUnhandledExceptionFilter()
과 함께 처리기를 설치하려고했지만 어떤 이유로 든 예외가 포착되지 않았습니다.
- 예외가 발생하지 않는 이유는 무엇입니까?
- FPU 예외를 포착하고 FPU 제어 단어를 재설정하고 아무 일도 일어나지 않은 상태로 실행을 계속하면 모든 베팅이 해제됩니까?
업데이트
내가 그들의 제안을 모든 사람에게 감사의 말씀을 전합니다. 저는 저뿐만 아니라 그의 코드의 다른 많은 고객들을 위해 인생을 편하게하기 위해 그가 할 수있는 것에 대한 저자 지침을 보냈습니다. 필자는 그가 FPU 제어 워드를 DllMain(DLL_PROCESS_ATTACH)
에 샘플링하고 나중에 제어 워드를 저장해야하므로 FPU CW를 내 이벤트 핸들러를 호출하기 전에 리셋 할 수 있고 내 호출에서 복귀 할 수 있다고 제안했다.
지금은 관심있는 사람이라면 해킹을 시도합니다. hack-around는 잠재적으로 나쁜 것입니다. 왜냐하면 나는 그의 코드 코드로 무엇을할지 모르기 때문입니다. 이전에 코드에서 부동 소수점 숫자를 사용하지 않고 확인을 받았으므로 FPU 예외를 사용하는 일부 제 3 자 코드는 제외하고이 코드가 안전해야합니다.
내 응용 프로그램에 적용한 두 개의 수정 :
- 메시지 펌프 바이 패스 코너 케이스를 잡으려고 창 후크 (
WH_CALLWNDPROC
)를 설치 내 메시지 펌프 - 랩은
두 경우 모두 FPU CW가 변경되었는지 확인합니다. 있을 경우 _CW_DEFAULT
으로 재설정합니다.
http://www.virtualdub.org/blog/pivot/entry.php?id=53; "위험한"코드 경로 이후에 FPU 제어 세계를 복원하는 코드가 추가되었지만 "Borland 런타임 라이브러리의이 동작을 비활성화하고이 문제를 피하는 것이 가능합니다" –
@matteo , 링크를 가져 주셔서 감사합니다. 흥미로운 읽기! 나는 그것을 저자에게 전달할 것이다. –
그건 그렇고, 그 게시물에 언급 된 그 행동을 해제하는 방법은 사실 그의 대답에 @ 데이비드에 의해 설명 Set8087CW 기능을 사용하는 것 같아요. –