2012-06-19 5 views
2

내 작업에 다음과 같은 문제가 발생했습니다. 동일한 소스 코드 (물론 진입 점 제외)를 기반으로하는 MFC .dll 및 MFC .exe 프로젝트가 두 개인 경우, 동일한 데이터를 처리 할 때 생성 된 결과 둘 다에 대한 모든 프로젝트 설정을 확인하고 모든 프로젝트 속성이 비슷하다는 것을 알았습니다 (적어도 중요하다고 생각하는 것들). 몇 가지 테스트를 실행 한 후 나는 다음 배운 :MFC .exe 및 .dll이 동일한 코드에 대해 다른 resuls를 생성합니다.

  1. MFC .exe를 모두 '디버그'와 '릴리스'모드에서 동일한 데이터 세트에 같은 결과를
  2. MFC의 .DLL은 '디버그를 위해 동일한 데이터 세트에 다른 결과를 '및'출시 '모드
  3. .dll의'릴리스 '결과가 .dll의'디버그 '결과 또는 .exe의'디버그 '또는'릴리스 '결과와 일치하지 않습니다.

.exe는 두 컴파일러 구성에 대해 동일한 결과를 제공하기 때문에 올바르게 작동한다고 가정합니다. 그러나이를 확인할 수는 없습니다. 따라서 .dll 'Release'구성으로 어떻게이 문제를 해결할 수 있습니까? 내 말은, 다른 사람들과 어떻게 강제로 일치시킬 수 있을까? 그러한 행동을 설명하는 것은 무엇입니까?

편집은 내가 델파이에 작성된 호스트 응용 프로그램을 사용하기 때문에 문제가 발생 같아요. 나는이 제안을 테스트하기 위해 새로운 C++ exe를 만들었고 어떤 실수도없이 정상적으로 작동하는 것을 보았다. 유일한 차이점은 델파이 응용 프로그램에서 사용할 DLL을 만드는 것입니다. extern "C"으로 표시되었지만 C++ 응용 프로그램에서는 extern으로 작성했습니다. 이 주제에 대한 다른 토론의 세부 사항은 here입니다. 그러나 extern 표시가있는 DLL을 "C"없이 사용하려고하면 내 Delphi 응용 프로그램에서 함수 입력 지점을 찾을 수 없다고보고합니다. 어떤 아이디어?

+0

결과가 정확히 무엇을 의미합니까? 일부 코드와 실제 출력을 게시하십시오. – Superman

+0

프로젝트 설정으로 코드를 디버깅하지 마십시오. 디버거를 사용하십시오. –

+0

음, 사실 많은 코드가 있습니다. 아마도 15 개 정도의 파일 일 것입니다. 분석하기가 거의 어렵다고 생각합니다. –

답변

1

각 호스트에 대한 8087 제어 워드의 값을 확인하십시오. 저는 Microsoft C가 Delphi가 사용하는 값과 다른 값을 사용하고 있음을 확신합니다. 보다 최근의 Delphi 버전에서는 Set8087CW와 SetPrecisionMode 및 SetRoundMode와 같은 래퍼와 같은 기능을 제공합니다. 그러나 아마 DLL에 구체적으로 설정 한 다음 계산이 끝나면 원본으로 복원하려고 할 것입니다.

+0

제안 해 주셔서 감사합니다. 확인해 보겠습니다.BTW 이전 TURBO PASCAL 컴파일러에서 8087 전처리기에 몇 가지 문제가 발생 했었지만이 시간까지 이미 사라 졌다고 생각했습니다. 좋아요. 고맙습니다. 도움이되는지 알려 드리겠습니다. –

+0

제안한 방법에 대한 문서를 검색하는 동안 CLR 지원 (이전에 설정되지 않은)을 설정하는 또 다른 방법을 발견했습니다. 이제는 효과가 있습니다. –

+0

@Rail 솔루션에 대한 대답을 작성하고 동의하십시오. 대답을 공식적으로 인정받는 것이 좋습니다. – mj2008

0

일부 코드 예제 없이는 대답하기가 어렵습니다. 그러나 고려해야 할 한 가지는 데이터 처리 코드가 프로세서를 호출하는 코드에서도 사용되는 전역 데이터 구조를 사용하는지 여부입니다.

Dll은 고유 한 별도의 주소 공간을 만들고 기본적으로 다른 전역 데이터 구조 집합에 액세스 할 수 있습니다.

주 코드에서 사용되는 결과와 처리 코드를 표로 만드는 데 사용하는 전역 테이블이 있다고 가정합니다.

모두 하나의 exe 인 버전에서는 동일한 테이블을 사용합니다. dll 버전에서, 처리 dll은 하나의 전역 집합을 사용할 것이고 exe는 다른 버전을 사용하고 있습니다.

관련 문제