2010-11-20 5 views
3

글자 나는 작업중인 작은 테스트 응용 프로그램을 컴파일하려고했습니다. (여기서 나는 약간의 종속성을 없애에 "멀티 스레드" "다중 스레드 DLL"에서 내 코드 생성을 설정코드 생성을 변경 한 후 특정 코드 줄을 코드 255로 끝냅니다.

는 다음 코드 줄 내 응용 프로그램 충돌 :

그래서 짧고 간단하게 유지하기

짧은 경로를 긴 경로로 변환하려고 할 때 충돌이 발생합니다. 같은 :

LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp")); 
GetLongPathNameA(tmp,tempFolder,MAX_PATH); 

충돌은 특히 첫 번째 줄에서 발생 : 여기 그래서

LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp")); 

어떤 아이디어를 당신이 코드 생성 모드를 전환 할 때 갑자기 작동을 멈 춥니 이유는 무엇입니까? 감사!

편집 : 후

일부 코드 재 작성 내가 찾아 관리가

+0

프로젝트를 빌드 할 때 경고가 있습니까? – Dialecticus

+0

아니, 그렇지 않다. 이상한 이유로 코드 255로 끝난다. – zeta

+1

왜'reinterpret_cast'가 필요한가요? 'getenv'의 결과는'char *'이며,'LPCSTR' (즉'const char *')로 자동 변환됩니다. 캐스트없이 오류가 발생하는 경우, 그들은 아마도주의가 필요할 것입니다. –

답변

0

가 시도 다른 모드에서 작업을 수행으로

getenv("Temp"); 

아주 아주 이상한 보는을 실행할 때 특히 충돌 프로젝트를 다시 빌드하십시오. 출력 파일을 지우고 출력 폴더에 아무 것도 남지 않았는지 확인한 후 .ncb를 삭제 한 다음 빌드하십시오.

+0

아니요, 작동하지 않습니다 ... – zeta

1

모든 프로젝트 (및 해당 프로젝트의 모든 파일)가 동일한 버전의 런타임 라이브러리 (예 : 다중 스레드 정적)에 대해 컴파일되고 링크되도록 일관되게 설정되었는지 확인하십시오. 이러한 옵션을 혼합하면 컴파일 및 링크 된 프로그램에 정의되지 않은 동작이 발생합니다. 또한 올바른 버전의 외부 라이브러리 (MFC 등)에 대해 컴파일하고 링크해야합니다. 경우에 따라 특정 버전의 런타임을 사용하도록 제한됩니다 (예 : 닷넷과 상호 운용한다면 멀티 헤드 dll 버전을 사용해야한다.

0

동적 런타임에서 정적으로 전환 한 후 libcmt.liblibcpmt.lib을 링커 설정에 종속적으로 지정 했습니까? 그렇지 않다면 시도해보십시오. 그리고 나서 다시 지어 라.

+0

libcmt.lib는 기본적으로 이미 링크되어 있으므로 보이게됩니다. libpcmt.lib 수동으로 링크를 관리했지만 여전히 충돌이 발생합니다. – zeta

0

reinterpret_cast는 다른 클래스에서 상속되거나 다른 클래스에서 상속 된 객체 용이므로 사용하면 안됩니다. 기본 유형에 대한 static_cast 또는 기본 유형에 대한 포인터 만 사용하십시오.

+0

'dynamic_cast'에 대해 생각하고 있지 않습니까? 'reinterpret_cast'는 상속과 아무 관련이 없습니다. –

+0

@ 닉 마이어 : 네, 그렇습니다. –

1

당신은 그것을 액세스하기 전에의 GetEnv()의 반환 값을 확인해야합니다 :

LPCSTR tmp = getenv("Temp"); 
if(tmp != NULL) 
    // do something with tmp 

내 생각 엔 당신의 프로그램이 환경 변수를 읽을 수 없습니다 그 결과 NULL 포인터에 액세스하는 프로그램이 충돌로 이어질 것입니다 . 나는 개인적으로 대신 WinAPI를 기능 GetEnvironmentVariable()로 전환하는 것이 좋습니다 것입니다

char *tmp; 
size_t requiredSize; 

getenv_s(&requiredSize, NULL, 0, "Temp"); 
tmp = (char *) malloc(requiredSize * sizeof(char)); 
if (tmp != NULL) 
{ 
    getenv_s(&requiredSize, tmp, requiredSize, "Temp"); 
    if(tmp != NULL) 
     // do something with tmp 

    free(tmp); 
} 

, 이것은 당신에게 줄 것이다

:

Microsoft는 getenv_s의 사용() 대신에, 여기에 약간 작업에 대한 수정 자신의 MSDN 샘플의 권장 더 자세한 오류 메시지 (함수가 실패한 경우 GetLastError() 사용)는 문제의 루트에 도달하는 데 도움이됩니다 (또는 이러한 대안 중 하나를 사용하여 해결할 수 있음).