CreateProcess 를 할때 Unicode 프로젝트에서 문제점

인스톨러 관련해서 처음 초기화 작업하는 어플을 작성하다보니 다른 프로세스를 순차적으로 실행하는데 이게 안되는거다 ㅜ.ㅜ;

이전엔 잘 쓰던건데 왜 안되는지 삽질 삽질 삽질하다가 방법을 찾았는데 Unicode 프로젝트에서는 아래와 같은 방법으로 하면 프로세서 생성이 안된다.

STARTUPINFO si;
PROCESS_INFORMATION pi;
memset( &si, 0, sizeof( si ) );
memset( &pi, 0, sizeof( pi ) );
BOOL bRet = ::CreateProcess( NULL,
_T("notepad.exe") , NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

아래와 같이 미리 버퍼에 복사하고 그 버퍼를 복사해 넣어야지만 생성된다.

STARTUPINFO si;
PROCESS_INFORMATION pi;
memset( &si, 0, sizeof( si ) );
memset( &pi, 0, sizeof( pi ) );
wchar_t tmp[] = _T("notepad.exe");
BOOL bRet = ::CreateProcess( NULL,
tmp  , NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

왜 유니코드에서 이런 문제가 되는지는 정확히는 모르겠지만 아마 문자열 길이나 유니코드시 첫바이트 값이라던지 그런게 아닐까 하는 추정을 해본다.

멀티바이트 프로젝트에서는 위와 같은 상황이 발생하지는 않는다.


Comments

“CreateProcess 를 할때 Unicode 프로젝트에서 문제점”에 대한 8개의 응답

  1. CreateProcess를 Unicode로 실행하면 두번째 파라미터인 lpCommandLine의 내용을 수정할 수 있습니다. 따라서 이매개 변수가 상수이면 액세스 위반이 발생합니다.
    참고 : https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa

    1. 오 그렇군요.
      감사합니다!

  2. 정말 감사합니다 ㅠㅠ 과제진행중인데 이 글 보고 해결했네욥

    1. 넵~

  3. 저도 갑자기 되던것이 유니코드에서 안되어서 검색하니 님의 글이 바로 나오네요.
    정보 감사합니다. ^^

    1. 저도 요거 삽질 좀 했네요 ㅎㅎㅎ

  4. 오..정보 너무 감사 합니다.^^

    1. ㅎㅎ 네에~

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다