2011-12-06 4 views
1

내 앱은 Delphi 2010으로 컴파일됩니다.이 앱은 Delphi 2010 컴파일 된 DLL을로드하는 Delphi 7 컴파일 DLL을로드합니다.Delphi 2010 앱 Delphi 7 DLL 로딩

D2010 app LOADS D7 DLL LOADS D2010 DLL 

D7 DLL의 내보내기 기능을 Widestrings 사용하고 델파이 2010 DLL 사용 strings의 수출 기능을합니다.

Delphi 2010의 strings은 유니 코드 (2 바이트)이며 Delphi 7에서는 Ansi (1 바이트)입니다.

내 모든 테스트에서 나는 그것이 안된다는 사실에도 불구하고 작동한다는 것을 보여주었습니다. 궁금합니다 :

왜 작동합니까?

무엇이 잘못 될 수 있습니까?

나는 AnsiString 유니 코드 페이로드를받을 수 있습니다 (델파이 2010 또는 델파이 7 메모리 관리자 DLL)

D2009과 D2010에
+0

이것이 작동하는 버그입니까? ;-) – Pol

+0

@ 폴 번호, 아닙니다. 나는 그것이 왜 효과가 있는지 이해하려고 노력하고있다. –

+0

질문에 대답은 없지만 양쪽 모두 WideString을 사용할 수 있습니다. 완전한 대답은 – Pol

답변

7

의 RTL 장소에서 로직 (컴파일러의 {$STRINGCHECKS ON} 지시)가 사용해야하는 메모리 관리자 , 그리고 UnicodeString을 사용하여 모듈 경계에서 Ansi 페이로드를 수신 한 다음 AnsiString/UnicodeString 데이터에 액세스 할 때 올바른 문자열 유형으로 자동 인라인 데이터 변환을 수행 할 수 있습니다. 주로 C++ 측에 AnsiString 매개 변수와 델파이 측 변수에 UnicodeString 변수가있는 이벤트 처리기를 사용하는 레거시 C++ 프로젝트를 지원하기위한 것입니다. 이 경우 D7 DLL이 Ansi 데이터를 D2010 DLL에 전달할 수도 있습니다 (XE에서는 STRINGCHECKS 지시문이 제거되었습니다).

StrRec 레코드 (메모리의 문자 데이터보다 우선 함)의 메모리 레이아웃이 코드 페이지에 대한 지원을 추가하기 위해 D2009에서 변경되었으므로 D710 DLL이 실패 할 것으로 예상되어 D7 DLL이 D2010 호환 가능 StrRecAnsiString 값을 D2010 DLL의 UnicodeString 매개 변수에 전달할 때. 존재하지 않는 메모리에 액세스하려고 할 때 D2010 DLL이 충돌 할 것으로 예상됩니다.

이것은 DLL 경계를 넘어 String 유형을 전달하는 것에 대한 또 다른 인수입니다. 그냥 하지마. 대신 WideString 또는 PAnsiChar/PWideChar을 사용하십시오.

+0

+1입니다. – Pateman

+0

큰 답변입니다. –

+0

+1 좋은 답변입니다. STRINGCHECKS에 대한 자세한 내용 http://www.micro-isv.asia/2010/09/stringchecks-gone-in-delphi-xe/ – Pol