2013-03-21 3 views
2

64 비트 컴퓨터에서 실행하려고하는 32 비트 프로그램이 있습니다. vssadmin 명령을 실행하여 복원 지점 정보를 가져 와서 텍스트 파일에 저장합니다. 자, 내 32 비트 컴퓨터에서 잘 작동하고 내 친구의 64 비트 컴퓨터에서 테스트 중이 었는데 작동하지 않습니다.32 비트 프로그램에서 64 비트 프로세스 실행

64 비트 시스템에서 실행되는 32 비트 응용 프로그램에서 system()을 사용하는 경우 32 비트 명령 프롬프트를 사용합니까? 그게 명령 프롬프트에서 명령을 수동으로 실행 했으므로 제대로 작동하지 않을 것이라고 생각할 수있는 유일한 방법입니다.

이 경우에 해당합니까? 어쨌든 올바른 명령 프롬프트를 사용하도록 강제합니까?

+0

은 사용하지 않습니다 내가 왜 이전에, 시스템은()하지 않습니다 말한대로 다른 컴퓨터에서 같은, 매트 피터슨 설명(), CreateProcess()를 사용합니다. – Jona

+0

@JonathanD Rightio, createprocess()를 사용하는 것으로 바뀌고 있지만 문자열을 LPWSTR로 변환하는 데 문제가 있습니다. 나는 그것을하기로되어있는 코드를 발견했으나 그렇지 않습니다. 지금 나는'std :: wstring widestr = std :: wstring (vsscommand.begin(), vsscommand.end());을 시도하고있다. \t \t \t \t \t \t \t의 wchar_t * widecstr = widestr.c_str();'하지만'오류 2 오류 C2440 받고 있어요 : '초기화'에 '* const를 wchar_t를'에서 변환 할 수 없습니다 '은 wchar_t *'' – Mike

+0

을 uchar은 st :: wstring을 wchar로 변환해야합니다.당신이 얻는 에러는 상수를 비 상수로 변환했기 때문입니다. 그 상수는 불가능합니다. D – Jona

답변

8

32 비트 응용 프로그램은 관련 "새 프로세스 만들기"시스템 호출을 사용하여 64 비트 프로세스를 시작할 수 있습니다. [system()은 여러 개의 레이어를 내부에서 수행합니다 시작하는 셸].

유일한 제한 사항은 32 비트 실행 파일이 64 비트 공유 라이브러리 (.so 또는 .dll)를 사용할 수 없거나 그 반대의 경우입니다. 그러나 새로운 프로세스는 새로운 실행 파일을로드함으로써 시작되며 그 시점에서 프로세스는 실행 파일 자체를 기반으로 32 비트 또는 64 비트가 될 수 있습니다.

0

당신은 항상 보안을 패배 그것은

  • 무거운 자원이

    • 때문에 시스템()을 사용하지 않아야합니다 - 유효한 명령의 또는 모든 시스템에서 같은 일을하는 경우 (모르는 Mats Petersson의 대답 참조) 시작하지 않으려했던 프로그램을 시작할 수도 있습니다. 프로그램을 직접 실행할 때 프로그램과 동일한 권한을 얻습니다. 예를 들어 시스템 관리자로 실행중인 경우 실수로 실행 한 악성 프로그램이 시스템 관리자로 실행되고있는 것입니다 . 그게 바보 같지 않으면, 맥박을 확인하십시오.
    • 바이러스 백신 프로그램이 싫어하면 프로그램에 바이러스로 플래그가 붙을 수 있습니다.

    CreateProcess()을 사용해야합니다.

    Createprocess()를 사용하여 .exe를 시작하고 새 프로세스를 만들 수 있습니다. 응용 프로그램이 호출 응용 프로그램과 독립적으로 실행됩니다.

    VOID startup(LPCTSTR lpApplicationName) 
    { 
        // additional information 
        STARTUPINFO si;  
        PROCESS_INFORMATION pi; 
    
        // set the size of the structures 
        ZeroMemory(&si, sizeof(si)); 
        si.cb = sizeof(si); 
        ZeroMemory(&pi, sizeof(pi)); 
    
        // start the program up 
        CreateProcess(lpApplicationName, // the path 
        argv[1],  // Command line 
        NULL,   // Process handle not inheritable 
        NULL,   // Thread handle not inheritable 
        FALSE,   // Set handle inheritance to FALSE 
        0,    // No creation flags 
        NULL,   // Use parent's environment block 
        NULL,   // Use parent's starting directory 
        &si,   // Pointer to STARTUPINFO structure 
        &pi)   // Pointer to PROCESS_INFORMATION structure 
        ) 
        // Close process and thread handles. 
        CloseHandle(pi.hProcess); 
        CloseHandle(pi.hThread); 
    } 
    

    참고 : 여기

    난 내 프로젝트 중 하나에서 사용되는 예제

  • +1

    건배 메이트. 나는 그걸 좀 더 살펴볼 것입니다. 시스템()을 사용하는 것보다 확실히 나을 것 같습니다. 이미 저를 위해 오해하고있는 것입니다. – Mike

    +0

    그래도 내 질문에 대답 했습니까? 내 질문은 32 비트 프로세스에서 64 비트 프로세스를 실행하는 방법이었습니다. "시스템()을 사용하지 않아야하는 이유는 무엇입니까?" – Mike

    +0

    코드를 사용하여 64 비트 프로세스를 실행 해 보셨습니까? 내가 말했듯이 system()은 모든 시스템에서 똑같이 작동하지 않는다. – Jona

    관련 문제