2014-09-10 2 views
2

이 방법이 간단 할 수 있지만 시간이 지남에 따라 유니 코드 문제가 너무 많은 고려 사항을 갖습니다.호환되지 않는 형식 StrAlloc가 StrAlloc과 함께 PWideChar를 반환하기 때문에 PAnsiChar 및 PWideChar

이 코드를 가지고 :

나는 그래서 내가

StrAlloc- 호환되지 않는 유형의 PAnsiChar와 PWideChar로

에 대한 오류가 발생하는 경우에, 그래서 구성 요소는, 지금 pcBuffer as PAnsiChar 원하는
pcBuffer := StrAlloc(Stream.Size + 1) where pcBuffer is defined as PWideChar 

StrAlloc가 PWideChar를 반환하기 때문에

어떻게 해결할 수 있습니까?

유니 코드 방식이나 GetMem을 통해 PAnsiChar or alloacate에 캐스트를 입력 할 수 있습니까?

답변

3

SysUtils 장치는 다음과 같은 기능을 정의

AnsiStrings 장치에서 StrAlloc()를 호출하는 대신 PAnsiChar을 할당하려면 PAnsiChar을 할당하십시오. 이것은 문자로 측정 된 Size을받습니다. 널 (NULL) 종료자를 고려해야합니다.

var 
    pcBuffer: PAnsiChar; 
.... 
pcBuffer := AnsiStrAlloc(Stream.Size + 1); 

그러나 이러한 기능은 더 이상 사용되지 않는 것으로 간주되어야합니다. 델파이의 이후 버전에서는 그러한 것들이 문서화되어 있습니다. 대신 AnsiString을 사용해야하므로 컴파일러에서 수명 및 메모리 할당을 관리하게하십시오.

var 
    str: AnsiString; 
    pcBuffer: PAnsiChar; 
.... 
SetLength(str, Stream.Size); 
pcBuffer := PAnsiChar(str); 

버퍼의 수명은 Delphi 문자열 변수의 경우와 마찬가지로 컴파일러에서 관리합니다.

위의 코드는 실제 문제를 해결하는 최선의 방법이 아닙니다. 더 자세한 정보를 보지 않고도 최고의 솔루션이 무엇인지 확실히 말하는 것은 어렵습니다. 내가 합리적으로 확신하는 유일한 것은 StrAlloc이며 친구들은 앞으로 나아갈 길이가 아니라는 것입니다.

+0

@Shanand 범위를 벗어나거나 "Finalize"등을 호출하여 문자열을 삭제합니다. 선택하는 기능은 무엇이든 사용하고, 사용하지 않으려는 경우 사용합니다. XE에서 컴파일되지 않는 코드 (태그가 추가 된 버전)를 언급하면 ​​틀린 것으로 보이는 대답을 수락하는 것이 이상합니다. 당신은 XE를 사용하지 않고 있습니까? 귀하의 의견은 매우 혼란 스럽습니다. 응답에 노력을 기울이고 질문에 중대한 세부 사항이 잘못되었음을 알면 실망합니다. 레미가 대답 할 때 코드를 고쳐 쓸 것이라고 확신합니다. –

+0

David : 사과 ... 잘못 대답을 잘못 쳤어.하지만 적어도 문제를 좁히기 위해 사용했습니다 - Remy가 제안한대로 AnsiStrings.AnsiStrAlloc (Stream.Size + 1); 그 때 당신에 의해 시정되었습니다. 당신이 레미의 견해를 언급 한 이래로 저는 그것에 매료되었습니다. 오히려 나는 나를 위해 일한 그의 의견에 대한 귀하의 회신에 행복했습니다. 제 질문은 U가 올바르게 대답 한 곳에서 꽤 분명하다고 생각합니다. 당신의 도움에 감사드립니다! 앞으로 귀하의 도움이 반드시 필요합니다. –

+0

D2007에있는 기존 코드는 XE6에서 해당 라인을 다시 써야합니다 (질문이었습니다). 어쨌든 - 그 해결하고 다른 문제와 함께입니다. 데이빗 & 레미 감사합니다. –

2

을 할당하는 SysUtils 장치에서 StrAlloc()을 호출하고 있습니다.

function AnsiStrAlloc(Size: Cardinal): PAnsiChar; 
function WideStrAlloc(Size: Cardinal): PWideChar; 
function StrAlloc(Size: Cardinal): PChar; 

당신이 AnsiStrAlloc를 호출해야합니다

델파이 XE에서
uses 
    ..., AnsiStrings; 

pcBuffer := AnsiStrings.StrAlloc(Stream.Size + 1); 
+0

지금까지 내가 말할 수있는 한, AnsiStrings.StrAlloc이라는 이름의 항목은 없었습니다. 아마도 AnsiStrings.AnsiStrAlloc을 생각하고있을 것입니다. 그러나 문제는 'AnsiStrings.AnsiStrAlloc'조차 존재하지 않는 XE 태그입니다. XE에서 함수는'SysUtils.AnsiStrAlloc'입니다. –