visual studio

조회수 1695회
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • CreateFile 는 아래 사진에 나와있는 프로젝트 설정 중 문자 집합의 값에 따라 의미하는 바가 달라지게 됩니다.

    이미지

    문자 집합의 값을 유니코드 문자 집합 사용을 설정면 UNICODE라는 전처리 매크로가 정의됩니다.

    UNICODE에 따라 아래와 같이 CreateFileW가 사용될지 CreateFileA가 사용될지가 결정됩니다.

    이미지

    경고를 보아하니 현재 UNICODE가 설정되어 있고 CreateFileCreateFileW를 의미하게 됩니다.

    CreateFileWL로 시작하는 와이드 캐릭터 문자열(L"hello")을 사용해야합니다. 하지만 사용하신 "\\\\.\\physicalDrive0"멀티 바이트 문자열입니다.

    Windows 에서 와이드 캐릭터 문자열은 한 문자를 2 바이트로 판단하기 때문에 그대로 실행하면 정상적인 동작을 하지 않습니다.

    이에 대한 해결 방법은 두가지 정도가 있습니다.

    • _T 이용하기

      _T는 처음에 설명한 설정에 따라 문자열의 종류를 자동으로 변경해 줍니다.

      HANDLE hFile = CreateFile(_T("\\\\.\\physicalDrive0"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
      
    • CreateFileA 또는 CreateFileW를 사용하기

      프로젝트 속성에 영향을 받지 않게 처음부터 사용할 문자열에 맞는 함수를 사용하면 됩니다.

      HANDLE hFile = CreateFileA("\\\\.\\physicalDrive0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
      

    로그를 추가해서 실행해 보았습니다.

    일반 실행을 했을 때는 아래와 같이 장치를 열수 없었습니다.

    이미지

    관리자 권한으로 실행 했을 때 아래와 같이 장치가 열렸습니다.

    이미지

    그 후 재부팅을 하면 아래 처럼 부팅에 실패한 것을 확인할 수 있습니다.

    이미지

    즉, 장치에 직접 접근하는 프로그램에서 관리자 권한 없이 실행하여 장치를 열 수 없어 쓰기 작업이 이루어 지지 않았던 것입니다. 물론 CreateFileA에로 변경하지 않았다면 제대로된 경로가 아니기에 장치도 열리지 않았을 것입니다.

    참고로 0코드로 인해 종료 되었습니다 란 말은 프로그램이 0을 반환했다는 말입니다. 프로그램이 0을 반환했다는 건 정상적으로 프로그램이 종료되었음을 의미합니다.

    • 말씀하신대로 문자집합에서 유니코드를 멀티바이트 문자 집합 사용으로 바꾸고 CreateFileA를 사용하니 [warning c4133: '함수' : 'char[19]'와 LPCWSTR사이의 형식이 호환되지 않습니다.]에러는 발생하지 않지만 여전히[xxxx프로세스이<가> 0코드로 인해 종료되었습니다.] 는 계속 cmd창으로 출력됩니다. 이건 어떻게 해야하시는지 알고 계시나요...? xxxx는 실행마다 값이 바뀌는 정수값입니다. 예)2456 ,3178, 4231 알 수 없는 사용자 2018.8.23 11:48
    • 코드 수정하신게맞나요?? 해당 경고는 몇번 줄에서 발생하나요?? 유동욱 2018.8.23 12:15
    • 밑에 답변 참고해주실 수 있나요? 알 수 없는 사용자 2018.8.23 15:33
    • 답변 추가했습니다. 유동욱 2018.8.23 20:12
    • 이렇게 정성껏 답해주셔서 정말 감사드립니다..ㅠㅠ 알 수 없는 사용자 2018.8.24 16:58

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)