2013-03-26 1 views
0

내 프로젝트에 ESENT를 아주 광범위하게 사용하여 정말 쉽고 빠르게 작동하는 것을 정말 좋아합니다. 그리고 너무 안정!Esent가 Delphi 프로젝트에서 Windows 8과 충돌 함

하지만 Windows 8에는 큰 문제가 있습니다 !!! 내가 JetSetSystemParameter가 아닌 다른 것을 호출 할 때마다 (동적 또는 정적으로) esent.dll에 연결하는 방법에 관계없이 dll은 충돌하고 내 응용 프로그램을 절벽 아래로 떨어 뜨립니다.

불행히도 나는 여전히 그걸 달릴 수 없습니다. 내 코드는 Windows 7 이상에서 실행해도 문제가 없었습니다. 하지만 Windows 8에서는 인스턴스 (부동 소수점 잘못된 연산)를 만들려고 할 때 esent.dll이 손상됩니다.

가능한 모든 호출 규칙을 시도했습니다. 이것은 확실히 문제가 아닙니다. 좀 더 시도하고 이상한 상황을 발견 : 1. 나는 VS 2012와 JetCreateInstance를 사용하여 데모 응용 프로그램을 만들었습니다. 2. 델파이 XE3의 똑같은 코드는 esent.dll을 충돌시킵니다. 3. 위의 데모 응용 프로그램에서 완벽하게 작동하는 메서드를 Delphi 버그라고 생각하여 VS 2012를 사용하여 DLL을 만들었습니다. 4. 그리고 나서 DLL을 데모 Delphi 프로젝트 (6, XE2 및 XE3으로 시도)에로드했습니다. 메서드와 붐이라고 불렀습니다. 같은 충돌.

내 가정은 Microsoft에서 허용하지 않는 것입니다. 다른 개발자 환경이 esent.dll과 올바르게 작동합니다. 가능합니까 ???

+1

Delphi의 FPU 설정 일 수 있습니다. 너는 그걸 바꾸려고 했니? – jachguate

+0

중복 : http://stackoverflow.com/questions/13415275/esent-crashes-with-windows-8 – bummi

+0

다른 하나를 닫는 것이 좋습니다. 이후로 이것은 프로그래밍 환경을 제공하고 예외의 더 나은 진단을 제공함으로써 더 좋은 질문입니다. –

답변

5

오류, 부동 소수점 잘못된 연산은 마치 부동 소수점 제어 단어와 관련이있는 것처럼 소리를냅니다.

기본적으로 Delphi는 부동 소수점 예외를 언 마스 킹합니다. 따라서 코드가 부동 소수점 유닛에 오류를 발생시키는 연산을 수행하도록 요청하면 FPU 신호가 예외로 변환됩니다.

그러나 대부분의 다른 Windows 개발 환경에서는 이러한 예외가 FPU에서 가려집니다. 이러한 코드는 FPU 예외가 마스크 된 실행 환경이라는 가정하에 작성됩니다. 그러나 Delphi에서 DLL을 호출하면 실행 환경에 마스크가 적용되지 않은 FPU 예외가 발생하여 해당 가정이 깨집니다. FPU 예외를 마스크하면 문제가 사라질 것입니다. 이 모든 예외를 마스크 및 기본 Windows 설정으로 FPU 제어 단어를 설정합니다

Set8087CW($027F); 

:

는이 문제가있는 경우, 당신은 단순히 초기 수명에서 실행, 코드에이를 추가 할 수 있습니다 테스트하려면 .

장기적으로이 DLL을 호출하기 전에 예외를 마스크 한 다음 DLL 호출이 반환 될 때 FPU 제어 단어를 복원 할 수 있습니다.

Default8087CW 전역 변수를 사용하기 때문에 Set8087CW은 스레드 세이프가 아니기 때문에 델파이와 함께 제공되는 라이브러리를 사용하는 게임은 약간 위험합니다. 해당 문제에 대해 더 자세히 알고 싶다면 QC#107411을 참조하십시오.

관련 문제