2016-06-13 8 views
0

RAD Studio 10.1 Berlin을 사용하여 최신 데스크톱 응용 프로그램을 현대 시대로 이식합니다. 앱은 C++ Builder 6에서 마지막으로 작성되었습니다 (많은 달 전).System.UStrClr 액세스 위반

모든 구성 요소와 외부 라이브러리 종속성을 분류 할 수 있도록 관리되었지만 유니 코드 포트와 관련된 일부 문제가있는 것으로 보입니다. 앱에 내장 된 String 유형에 크게 의존하는 데 사용되어 이제 AnsiString에 해당합니다.

소스 코드가 빌드되지만 응용 프로그램 코드가 실행되기 전에 바이너리가 액세스 위반을 throw합니다. 오류 스택 추적 :

[email protected]@@UstrClr$qqrpv + 0x12 
largest_pos 
__linkproc__ Attributebitmaps::Initialize 0x18 
__init_exit_proc 
__wstartup 

largest_pos 함수는 어떤 종류의 문자열 종속성도 없습니다.

Attributebitmaps은 정적 클래스이며 Initialize이라는 멤버가 없습니다. 델파이에서는 단위 레벨에서 InitializeFinalize 콜을 선언 할 수 있지만 C++ 빌더에서는이 구문을 사용하지 않습니다.

System.UStrClr에서 오류가 발생하는 이유에 대한 아이디어가 있으십니까? 이 점에 대해 더 많은 통찰력을 얻기 위해 어디에서 파고 나니? SO에 수많은 다른 게시물에 언급 된 정적 초기화 실패작에 관련

+1

사용자 정의 엔트리 포인트 이전에 실행되는 코드는 일반적으로 정적 초기화 프로그램이며 액세스 위반은 정의되지 않은 정적 개체 초기화 순서의 결과보다 더 자주 발생합니다. 'Attributebitmaps' 클래스는 초기화되는 다른 정적 객체에 의존합니까? – IInspectable

+1

'Attributebitmaps'에는'UnicodeString' 멤버가 있습니까? 'UStrClr()'은 RTL의 함수로'UnicodeString' 변수를위한 메모리를 해제합니다. 따라서, "UnicodeString"변수가 해제되기 전에 손상되었거나 호출 스택 자체가 손상되어 우연히'UStrClr()'으로 점프하고 있습니다. 어느 쪽이든, 실제 코드를 보지 않고는 이것을 대처할 수있는 방법이 없습니다. –

+0

'Attributebitmaps'에는'UnicodeString' 멤버가 없습니다. 그것은'TCanvas'와 몇몇의 관련된 VCL 클래스들에 의존하지만, 어떤 종류의'String' 멤버들도 없습니다. 그래도 고마워. 계속 찾고있어. – Ryan

답변

0

,이 경우 범인은 다음과 같은 패턴이었다

.h 파일 :

class SomeClass { 
    static String SOME_STATIC_STRING; 
}; 

String SomeClass::SOME_STATIC_STRING("foo"); 

당신은을 사용하도록 선택하는 경우 이런 이니셜 라이저는 .cpp 파일로 이동해야합니다.