2009-07-24 2 views
0

사용 중다음 시나리오에서 유형 변환을 수행하는 방법은 무엇입니까?

TCHAR 버퍼 [MAX_SIZE]; 내가 폴더의 상대 경로를 gettig하고 단계 중 일부 설정 후

전직 말할 :

C : \ Microsoft.NET 프레임 워크 \ \ v1.0.037 \

위의 경로의 버퍼에 있기 때문에 TCHAR와 내가 인수로 LPCTSTR 형식을 취 CreateProcess를()에 전달해야하기 때문에 내가 LPCTSTR의 경로를 변환해야 덧붙이 후 CONCATENATE "는 RegAsm.exe"

에 노력하고 입력

다음 컴파일러는 error.I 시도했지만 화가났다. 당신은 내가 항상 CreateProcess를() 함수를 호출 할 때 다음, 표준 : : 문자열을 사용하는 것이 좋습니다 것입니다 쉽게 당신의 인생을 그냥 이렇게하려면

는 하나

+0

컴파일러 오류가 무엇입니까? –

+0

버퍼 + "RegAsm.exe"와 같은 것을하고있어 컴파일러 오류가 발생합니까? – Naveen

+0

예 정확히 동일 – Cute

답변

1

TCHAR 및 CreateProcess는 유니 코드로 컴파일할지 여부에 따라 다르게 확장되는 매크로입니다. 단점은 GetCORSystemDirectory()가 유니 코드 버퍼만을 허용한다는 것입니다.이러한 ANSI/유니 코드 문제를 제거하려면이 코드 부분을 유니 코드에 명시 적으로 작성하십시오.

TCHAR 대신 버퍼에 WCHAR을 사용하십시오. CreateProcess() 대신 CreateProcessW()를 사용하면 유니 코드 버퍼를 기꺼이 받아 들일 것입니다. 문자열 연결에 wcscat()를 사용하십시오. 이 같은

뭔가 (오류가 생략 핸들링) :

WCHAR buffer[MAX_PATH + 1]; 
DWORD realLength; 
GetCORSystemDirectory(buffer, MAX_PATH, &realLength); 
*(buffer + realLength) = 0;// Don't forget to null-terminate the string 
wcscat(buffer, L"regasm.exe"); 
CreateProcessW(/*pass buffer here*/); 
+0

을 사용하도록 제안하지만 CreateProcessW()를 사용하면 STARTUPINFO & si를 LPSTARTUPINFOW로 변환 할 수 없으므로 CreateProcW()에서 LPSTARTUPINFOW와 si를 사용 했으므로 이제는 정상적으로 작동합니다 ..... 감사합니다. ur suuport .. – Cute

+0

대신에 STARTUPINFOW 유형의 변수를 선언해야합니다. 이것이 더 정확합니다. – sharptooth

0

.... 이러한 측면에서 나에게 도움이 될 수 있습니다

std::string myPath = "somePath"; 
LPCTSTR lpBuf = reinterpret_cast<LPCTSTR>(myPath.c_str()); 

아직 테스트를 거치지는 않았지만 그래도 문제가 해결되지 않으면 코드를 게시하면 도움이 될 것입니다.

유니 코드를 사용하는 경우 더 복잡 할 수 있습니다.

+0

YUP의 작동. 허 레이 ........ 그러나 reinterpret_cast를 사용하는 어떤 일이든 ... – Cute

+1

이 재 해석 캐스트는 절대로 사용하지 마십시오. LPCTSTR lpBuf = myPath.c_str(); 시스템이 올바르게 구성되어 있으면 작동합니다. – Totonga

+1

절대 수행해서는 안됩니다. string :: c_str()이 ANSI이면 reinterpret_cast가 나중에 CreateProcess라는 쓰레기를 전달하게됩니다. 문제의 수정이 아니라 컴파일러에게 오류 메시지가 표시되지 않도록 요청하는 것입니다. – sharptooth

0

나는 당신이 mbstowcs 함수wcstombs 기능을보고 할 수있는 경우에 당신은 당신이 유니 코드로 작업 오류가 있다는 사실 ...에서 가정합니다.

실제로 제대로 대답 할 수있는 정보가 더 필요합니다.

2
_tcscat_s 

은 TCHAR에 관련된 방법입니다. 그것은 _UNICODE & _MBCS 전 처리기 swithch의 TCHAR와 같으며 strcat_s 또는 wcscat_s로 해석됩니다.

TCHAR buffer[MAX_SIZE] = _T("c:\Microsoft.NET\Framework\v1.0.037\"); 
_tcscat_s(buffer, MAX_SIZE, _T("RegAsm.exe")); 

하지만 이것은 매우 오래된 구식 C 스타일입니다. 따라서 TCHAR을 사용하는 동안 도 MFC 관련 항목을 사용하는 것이 좋습니다. 따라서 _UNICODE & _MBCS의 영향을받는 CString을 사용하면 문제도 해결됩니다.

CString buffer; 
buffer = _T("c:\Microsoft.NET\Framework\v1.0.037\"); 
buffer += _T("RegAsm.exe"); 
CreateProcess(buffer, .. 

표준 : : 문자열 또는 표준 : 그들이 전처리와 관련된 자신의 동작을 변경하지 않기 때문에 스위치 형식 wstring은 도움이되지 않습니다하지만 당신은 CreateProcessA 또는 CreateProcessW 당신은 ​​또한 표준 : : 문자열 또는 표준을 사용할 수 있습니다 사용하는 경우 : wstring.

+0

+1 CString – Naveen

0

버퍼 + "RegAsm.exe"를 수행하면 두 개의 포인터를 추가하는 것과 같을 것입니다. (배열이 포인터로 붕괴되고 "RegAsm.exe"가 const TCHAR * 일 수 있습니다) 따라서 컴파일러 오류가 발생합니다. 당신이 원하는 것은 문자열 concatanation입니다. 연결을 수행하려면 _tcscat 또는 보안 버전 (MSDN에서 주장) _tcscat_s 함수를 사용하십시오.

관련 문제