2013-06-13 3 views
0

ATL 변환 매크로 A2T를 사용하여 std :: string과 const TCHAR * 사이를 변환합니다. 그런 다음 TCHAR *에 파일 구문 분석을위한 추가 기능을 제공합니다. 다음과 같은 처리를 할 때, 그것을 작동 :ATL 변환 매크로 자체의 기능을 좋아하지 않습니다.

USES_CONVERSION; 
const TCHAR* fileName = A2T(file.c_str()); 
foo(filename); 

을 그러나, 나는 빈 검사를 리팩토링을 시도하고 변환이 새로운 기능을 사용하여 :

const TCHAR* StringToTChar(const string s) 
{ 
/* To be added in 
     if(s.empty()) 
     { 
      return NULL; 
     } 
*/ 
     USES_CONVERSION; 
     const TCHAR *ts= A2T(s.c_str());//Using ATL, convert to TCHAR* 
// assert(ts!=NULL); to be added 

    return ts; 
} 

이제 함수 foo (파일 이름)을 말한다을 내가 제공 한 파일을 열 수 없습니다. 파일 이름 변수의 형식이 잘못 지정 되었기 때문에이 가정 만 할 수 있습니다. 이 코드에 문제가 있습니까?

감사합니다,

에릭

편집 : 그것은 입력 문자열과 같은 는 "C : \ ABC \ 구축 \ DVV \ ggg.trc"이고 수신 문자열 foo는이 "는 C : \ ABC \ buivv \ ggg "

+2

이 내용은 [ATL 및 MFC 문자열 변환 매크로] (http://msdn.microsoft.com/en-us/library/87zae4a3(v= VS.80) .aspx)에서 설명합니다. 특히 ATL 3.0 매크로 동작 표에서 "함수가 종료되면 문자열이 해제됩니다."라는 메시지가 표시됩니다. –

답변

0

A2T 매크로는 스택 메모리 공간을 사용하여 문자열을 변환합니다. ts 포인터는 함수에서 돌아올 때까지 유효하며 그 포인터가 가리키는 데이터가 손상 될 때까지 유효합니다.

반환 유형을 ATL::CString으로 변경하면 문제가 해결됩니다.

관련 문제