2013-08-21 1 views
1

최근 델파이 2006에서 XE3으로 변환 된 프로그램이며 TidHttp에 문제가 있습니다. 이것은 '{'오류에서 처리 루틴으로보고 - 나는 오류 '제기 예외가 자료 64 문자열에 잘못된 문자'얻을TidHttp 및 XE3

Result := ''; 
myCurrentTime := FormatDateTime('yyyymmddhhnnss',now); 

myParams := '<params>'; 
myParams := myParams + '<licence>' + '1234567890' + '</licence>'; 
myParams := myParams + '<activationcode>' + 'abcdef' + '</activationcode>'; 
myParams := myParams + '<devicename>' + 'aaa' + '</devicename>'; 
myParams := myParams + '<deviceid>' + 'bbb' + '</deviceid>'; 
myParams := myParams + '<devicetimestamp>' + myCurrentTime + '</devicetimestamp>'; 
myParams := myParams + psRequest; 
myParams := myParams + '</params>'; 

myRequestStream := nil; 
myResponseStream := nil; 
myHTTP := nil; 
myXMLDocument := nil; 

finished := false; 
myAttempts := cAttempts; 

while finished = false do 
begin 
try 
    myRequestStream := TMemoryStream.Create; 
    myResponseStream := TMemoryStream.Create; 
    myHTTP := TIdHTTP.Create; 
    myXMLDocument := TXMLDocument.Create(nil); 

    myParams := mEncoder.Encode(myParams); 

    myRequestStream.Write(myParams[1], Length(myParams)); 
    myRequestStream.Position := 0; 

    myHTTP.Request.Method := 'POST'; 
    myHTTP.ReadTimeout := piTimeoutSeconds * 1000; 
    myHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; 
    myHTTP.Request.ContentLength := myRequestStream.Size; 
    myHTTP.ProtocolVersion := pv1_1; 

    myHTTP.Post(psUrl, myRequestStream, myResponseStream); 

후 다음 : 여기에 코드입니다.

웹을 수색했지만 답변을 찾을 수 없습니다. 어떤 제안이라도 대단히 감사하겠습니다.

감사합니다.

스티브

답변

0

요청 세부 정보의 절반 만 스트림에 저장합니다. Delphi 2009에서 string은 유니 코드 형식이되어 각 문자는 2 바이트를 차지합니다. Length은 문자를 측정하고 TStream.Write은 바이트 수를 나타냅니다.

쉬운 솔루션은 myParamsAnsiString으로 변경하는 것입니다.

+1

대신 'TStringStream' 또는 Indy의'WriteStringToStream()'함수를 사용하는 것이 좋을 것입니다. 둘 다 유니 코드 문자열을 지원하고 바이트로 변환 할 것입니다. AnsiString이 더 이상 Embarcadero의 모바일 컴파일러에 존재하지 않기 때문에 특히 모바일로의 이전을 계획하고 있다면 코드를 Ansify하지 마십시오. –

관련 문제