안녕하세요이 스택 오버 플로우 내 첫 번째 질문입니다 출력 텍스트 (임 주니어 프로그래머 : gramatical 실수에 미리 사과는 내가 만들 그래서 P 너무 불어 ...)어떻게 내가 이미 다른 콘솔 열린 C++
int main(int argc, char *argv[])
{
HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
if (UAC::IsAppRunningAsAdminMode())
{
printf("Process Already elevated\nChecking if self invocated from unprevileged previous run...\n");
if (argc > 1)
{
std::string consoleTextOutputBuffer("Elevated privileges session started...\n");
WriteConsoleA((HANDLE)argv[2], consoleTextOutputBuffer.c_str(), consoleTextOutputBuffer.size(), NULL, NULL);
}
}
else
{
printf("Process need elevation...\n");
if (UAC::BeginPrivilegeElevationPrompt(consoleHandle))
{
printf("Elevation succesfull!\n");
}
else
{
printf("Elevation failed\n");
system("pause>nul");
exit(-1);
}
}
}
:
임 출력을
(어떤 충돌이 에러없이 그냥 일반 무) 여기
를 작성하지 않으려면 부모의 콘솔에 다시 연결하는 상승 과정을 시작하려고하는 것은 내 코드입니다
그리고 내가 쓴 클래스 UAC에서 :
BOOL BeginPrivilegeElevationPrompt(const HANDLE& oldConsoleHandle)
{
wchar_t szPath[MAX_PATH];
if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)))
{
// Launch itself as admin
std::string oldConsoleHandleToString = std::to_string((int)oldConsoleHandle);
std::wstring wsConsoleString(oldConsoleHandleToString.begin(), oldConsoleHandleToString.end());
SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.lpVerb = L"runas";
sei.lpFile = szPath;
sei.hwnd = NULL;
sei.lpParameters = wsConsoleString.c_str();
sei.nShow = SW_NORMAL;
if (!ShellExecuteEx(&sei))
{
DWORD dwError = GetLastError();
if (dwError == ERROR_CANCELLED)
{
// The user refused to allow privileges elevation.
printf("User did not allow elevation.\n");
return false;
}
return false;
}
else
{
return true;
_exit(1); // Quit itself
}
}
printf("Could not load module name.\n");
return false;
};
제목은 질문이지만, 귀하의 코드와 어떤 관련이 있는지 잘 모르겠습니다. 그것은 작동하지 않는 것은 무엇입니까? –
콘솔 화면 버퍼 핸들 값은 상승 된 프로세스에서 의미가 없습니다. 논쟁으로 그것을 전달하는 것은 무의미하다. 출력을 쓰려면 상위 콘솔에 다시 연결하는 상승 된 프로세스를 찾고 있습니까? 가능합니다. – eryksun
문자열을 다시 핸들로 변환합니까? 그 결과는 무엇입니까? 전혀 작동하지 않거나 잘못 인쇄되거나 충돌이 발생합니까? –