본문 바로가기

Developement/DELPHI (pascal)

C++ 에서 만든 DLL 과 math 연동시 오류 : Invalid Floating Point Operation

어느 댓글을 남겨 주신 광란의사랑 말씀대로 이때까지 해 보지 않았던 math 연동 DLL 을 테스트 해 보았습니다.
일단 델파이 에서는 표시 할 수 없는 -1.#INF 가 나오므로 FloatToStr() 함수를 거치면 NAN 으로 표시 됩니다.
그냥 만들게 되면 Invalid Floating Point Operation 오류 가 발생 하는데, 이는 Delphi 의 FPU monitor 플래그 때문에 발생 하는 문제 입니다.
이 문제는 다음 실제 사용된 코드와 같이 쓰시면 해결이 가능합니다.

아래에 예제 샘플을 추가 합니다.
사용된 툴은 CodeBlocks 와 minGW , 그리고 TurboDelphi Explorer(2006) 입니다.
압축을 풀면 CUSTMATH 디렉터리와 , DELPHI 가 각각 있습니다.
CUSTMATH 가 C++ 로 만들어진 DLL 이 들어가게 되며, DELPHI 에 호출하는 프레임 예제가 있습니다.

물론 여기서 알아야 할 점은 DLL 생성시 call type 을 어떻게 정의 했냐를 서로 맞추어야 한다는 점 입니다.
DLL 을 EXPORT/IMPORT 로 둘때 다음과 같이
#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif
를 사용하셨다면 Delphi 에서는 stdcall 형으로 불러야 합니다.
예를 들자면 제가 선언한 C++ DLL 에서는
double DLL_EXPORT func_log10(const double num);
를 사용하였고, Delphi 에서는 이렇게 타입을 정의 합니다.
type
    t_func_log10 = function(const num:double):double;stdcall;
즉, C++ 에서 declspec 이 delphi 에서는 stdcall 형이라는 것 입니다.
이걸 맞춰 주지 않으면 함수 호출시 인자전달 방법이 다르므로 정상적인 구동이 이루어 지지 않습니다.
도움이 되셨기를 바라네요.