2014-03-12 2 views
0

프로그램을 실행 한 후 모든 통화가 종료 된 후 주 프로그램에 문제가 있습니다. 그것은 내 코드 또는 아무것도, 그래서 난 새 프로젝트를 만들려고했는데 오류가없는 동일한 일을 할 오류가 발생하지 않습니다.프로그램이 실행되지 않습니다 - 열리고 닫힙니다

난 예제 코드 시도 :

int APIENTRY WinMain (HINSTANCE ...) 
    ShellExecute(NULL, (LPCWSTR)"open", (LPCWSTR)"cmd.exe", NULL, NULL, SW_SHOW); 

을 그리고 그것은 여전히 ​​열리고 닫힙니다. 여기서 문제는 무엇입니까? 필요한 경우 출력 로그를 제공 할 수 있지만 잘 모르겠습니다.

+0

프로그램이 실행되고 지침을 모두 완료하면 프로그램이 종료됩니다. 전체 프로그램을 보여줄 수 있고 왜 그것이 오랫동안 열려 있어야한다고 생각하는지 이유를 나타낼 수 있습니까? –

+4

질문의 코드는 매우 잘못되었습니다. 'const char *'를'const wchar_t * '에 던져도 그렇게되지 않습니다. 매번 캐스트를 사용할 때마다 걱정해야합니다. 넓은 리터럴을 사용할 필요가 있습니다 :'L "open"'. 또한 오류가 없다고 주장합니다. 하지만 당신이 오류를 확인했다는 어떤 증거도 보이지 않습니다. –

+0

@DavidHeffernan 실행시 cmd.exe를 열면 안됩니까? 그것은 그렇게하지 않습니다. 그렇다면 그것이 어떻게 컴파일 된 것을 의미합니까? 릴리스에서 응용 프로그램을 실행하면 cmd.exe가 실행됩니다 - 아니요? 내 말은 그것이 내가해야 할 일이었던 것입니다. – user3267146

답변

5

개폐에 대한 의미를 이해하지 못했습니다. 그러나이 코드는 매우 잘못되었습니다.

ShellExecute(NULL, (LPCWSTR)"open", (LPCWSTR)"cmd.exe", 
    NULL, NULL, SW_SHOW); 

캐스트가 좋지 않습니다. 두 문자열 리터럴은 const wchar_t*으로 캐스팅하는 char의 배열에 대한 포인터이므로 그대로 유지됩니다. 컴파일러는 여러분이 알고있는 것보다 더 잘 알고 있다고 신뢰합니다. 너는하지 않는다. 그들은 실제로는 const wchar_t*이 아닙니다. 모든 캐스트는 형식 안전성을 깨고 유익한 컴파일 타임 오류를 런타임 오류로 변환 할 수 있도록 해줍니다. 언어에 대해 깊이 이해할 때까지는 주조하지 않아야합니다.

당신은 넓은 리터럴을 사용할 필요가 :

ShellExecute(NULL, L"open", L"cmd.exe", NULL, NULL, SW_SHOW); 

당신은 또한 오류 확인을 수행하지 것으로 나타났습니다. ShellExecute으로 매우 어렵습니다. 대신 ShellExecuteEx을 시도하고 반환 값에 유의하십시오.

+0

ShellExecuteEx는 내 오류가 OllyDbg로 디버깅하는 동안 정확히 무엇인지 보여주었습니다 -> 도움이되었습니다 ... 감사합니다. – user3267146

관련 문제