CreateProcess : APPCRASH : Windows 7 x64

141
11 января 2020, 09:20
#include <windows.h>
#include <tchar.h>
TCHAR GAppname[]=TEXT("AppRun");
TCHAR GCmdLine[2048];
const TCHAR* appCmdLine()
{
    return GCmdLine;
}
//
// Get system error
//
const TCHAR* appGetSystemErrorMessage(int Error=0)
{
    static TCHAR Msg[1024];
    *Msg=0;
    if(0==Error)
        Error=GetLastError();
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, Error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), Msg, 1024, NULL);
    if(wcschr(Msg,'\r'))
        *wcschr(Msg,'\r')=0;
    if(wcschr(Msg,'\n'))
        *wcschr(Msg,'\n')=0;
    return Msg;
}
const void appGetLastError(TCHAR* Str)
{
    TCHAR Msg[4096]=TEXT("");
    wsprintf(Msg, TEXT("s%\nGetLastError : %d\n\n%s"), Str, GetLastError(), appGetSystemErrorMessage());
    MessageBox(NULL, Msg, TEXT("System Error"), MB_OK|MB_ICONSTOP|MB_SETFOREGROUND|MB_TOPMOST);
}
void* Spawn(const TCHAR* Parms)
{
    TCHAR CommandLine[1024];
    wsprintf(CommandLine, TEXT("%s"), Parms);
    PROCESS_INFORMATION ProcInfo;
    STARTUPINFO StartupInfo = {sizeof(STARTUPINFO), NULL, NULL, NULL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, NULL, NULL, NULL, STARTF_FORCEOFFFEEDBACK, SW_SHOWNORMAL, NULL, NULL, NULL, NULL, NULL};
    SECURITY_ATTRIBUTES Attr;
    Attr.nLength=sizeof(SECURITY_ATTRIBUTES);
    Attr.lpSecurityDescriptor=NULL;
    Attr.bInheritHandle=TRUE;
    if(!CreateProcess(NULL, CommandLine, &Attr, &Attr,TRUE, DETACHED_PROCESS|REALTIME_PRIORITY_CLASS, NULL, NULL, &StartupInfo, &ProcInfo)) {
        HINSTANCE ShellExError=ShellExecute(NULL, TEXT("open"), CommandLine, NULL, NULL, StartupInfo.wShowWindow);
        if(INT_PTR(ShellExError)<=32) {
            return NULL;// Could not spawn process.
        }
    }
    return (void*)ProcInfo.hProcess;// Process spawn!
}
void appInit(const TCHAR* InCmdLine)
{
    if(*InCmdLine=='\"') {
        ++InCmdLine;
        while(*InCmdLine && *InCmdLine!='\"')
            ++InCmdLine;
        if(*InCmdLine)
            ++InCmdLine;
    }
    while(*InCmdLine && *InCmdLine!=' ')
        ++InCmdLine;
    if(*InCmdLine)
        ++InCmdLine;
    lstrcpy(GCmdLine, InCmdLine);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    const TCHAR* CmdLine=GetCommandLine();
    appInit(CmdLine);
    if(!lstrlen(GCmdLine)) {
        MessageBox(HWND_DESKTOP, TEXT("Missing Command Line"), GAppname, MB_OK|MB_ICONSTOP|MB_SETFOREGROUND|MB_TOPMOST);
        return EXIT_FAILURE;
    }
    TCHAR AppName[2048]=TEXT("");
    wsprintf(AppName, TEXT("\"%s\""), GCmdLine);
    if(!Spawn(AppName)) {
        appGetLastError(TEXT("Could not CreateProcess:"));
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

Запускал по-разному, т.е. пример бат-файла:

AppRun D:\tools\edit\npp7_x64\notepad++.exe

После запуска, немного "думает" и выдает:

Сигнатура проблемы:
  Имя события проблемы: APPCRASH
  Имя приложения:   AppRun.exe
  Версия приложения:    0.0.0.0
  Отметка времени приложения:   5ca5c2fb
  Имя модуля с ошибкой: USER32.dll
  Версия модуля с ошибкой:  6.1.7601.17514
  Отметка времени модуля с ошибкой: 4ce7ba59
  Код исключения:   c0000005
  Смещение исключения:  0003da5f
  Версия ОС:    6.1.7601.2.1.0.256.1
  Код языка:    1049
  Дополнительные сведения 1:    dddf
  Дополнительные сведения 2:    dddf54b75db0389a89feab5caacfb6e5
  Дополнительные сведения 3:    f392
  Дополнительные сведения 4:    f392d91e9d5c3d69d9462ea4584c7cac
Ознакомьтесь с заявлением о конфиденциальности в Интернете:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0419
Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
  C:\Windows\system32\ru-RU\erofflps.txt

Делал: sfc /scannow, но не удается исправить ошибки... Взял, переустановил Windows. Всё-равно, также...

Да. IDE: vс2008

Так заработало:

TCHAR AppName[2048]=TEXT("");
/*wsprintf(AppName, TEXT("\"%s\""), GCmdLine);
*if(!Spawn(AppName)) {
*   appGetLastError(TEXT("Could not CreateProcess:"));
*   return EXIT_FAILURE;
}*/
lstrcpy(AppName, appCmdLine());
const TCHAR* ExeName=wcstok(AppName, TEXT(" "));
if(!Spawn(ExeName)) {
    appGetLastError(TEXT("Could not CreateProcess:"));
    return EXIT_FAILURE;
}
READ ALSO
Как добавить пустой массив в массив?

Как добавить пустой массив в массив?

Как на С++ будут выглядеть следующие строчки написанные на Python:

145
Как заменить каждый элемент матрицы на среднее арифметическое?

Как заменить каждый элемент матрицы на среднее арифметическое?

Дана квадратная матрица и число nЗаменить каждый элемент матрицы на среднее арифметическое элементов квадрата размера 2n+1 с центром в данном...

156
Ошибка компиляции No Target Architecture

Ошибка компиляции No Target Architecture

Хочу начать дебагинг проекта, написал простенькую тестовую функцию в классе которая взаимодействует с Windows APIКонечный компютер x86

138
C++ Сравнить два N-арных дерева

C++ Сравнить два N-арных дерева

У меня есть 2 дерева представленные такой структурой подскажите идею как их можно сравнить между собой,(данные хранятся только в листах)

138