Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблемы с реализацией CreateProcess


Автор: Rutti 21.3.2006, 19:57
Есть программа, которая создаёт загрузочные дискеты для Win XP (makebt32.exe). При её запуске просят ввести букву дисковода и нажать любую клавишу.
Через CreateProcess запускаю программу с параметром a:
Код

    STARTUPINFO si = { sizeof(STARTUPINFO) };
        PROCESS_INFORMATION pi;

    string AppPath="\\BOOTDISK\\makebt32.exe";

    CreateProcess(AppPath.c_str(), "makebt32 a" ,NULL,NULL,FALSE, 0,NULL,NULL,&si,&pi);    

    WaitForSingleObject( pi.hProcess, INFINITE );

        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );


Программа не запускается. Что не так?

P.S. А как решить проблему с нажатием "любой клавишы".

Автор: NextAlex 22.3.2006, 10:02
Код

#define curDir L".\\BOOTDISK\\"
#define process L".\\BOOTDISK\\makebt32.exe a:"
...
            PROCESS_INFORMATION l_NewProcessInfo = {0}; 
            STARTUPINFO l_NewProcessStartupInfo = {0}; 
 
            l_NewProcessStartupInfo.cb = sizeof(STARTUPINFO); 
            l_NewProcessStartupInfo.dwFlags = STARTF_USESHOWWINDOW; 
            l_NewProcessStartupInfo.wShowWindow = SW_SHOWNORMAL; 
            if (!CreateProcess(process, NULL, NULL, NULL, false, 0,NULL, curDir, &l_NewProcessStartupInfo, &l_NewProcessInfo)){
    TCHAR szBuf[80] = ""; 
     LPVOID lpMsgBuf;
        FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );

       wsprintf(szBuf, 
        "%s failed with error ", 
        lpMsgBuf);

    MessageBox(NULL, szBuf, "Error", MB_OK); 

    LocalFree(lpMsgBuf);
}


и кстати у тебя путь неправильно указан - нужно либо писать полный путь либо перед первым слешем точку ставить

Автор: Rutti 26.3.2006, 16:13
NextAlex

Спасибо! Всё нормально. Правда, я немного переделал этот вариант:
Код

std::string WXP=".\\BOOTDISK\\makebt32.exe a";

std::string CutCurDir(std::string AppPath)
{
    std::string::size_type i=AppPath.std::find(".exe");
    AppPath.erase(i, AppPath.size());
    i=AppPath.rfind("\\");
    AppPath.erase(i, AppPath.size());

        return AppPath;
}

DWORD WINAPI WinXP( LPVOID lpParam) 
{
        using namespace::std;

        STARTUPINFO si = { sizeof(STARTUPINFO) };
        PROCESS_INFORMATION pi;

        si.cb = sizeof(STARTUPINFO);
        si.dwFlags = STARTF_USESHOWWINDOW;
        si.wShowWindow = SW_SHOWNORMAL;

        string curDir=CutCurDir(WXP);

        char cmd[256];
        string b=WXP;
        strcpy(cmd, b.c_str());

        if(!CreateProcess(NULL, cmd, NULL, NULL, false, 0,NULL, curDir.c_str() , &si, &pi))
        {
                TCHAR szBuf[80] = "";
                LPVOID lpMsgBuf;
                FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
                wsprintf(szBuf, "%s",lpMsgBuf);
                MessageBox(NULL, szBuf, "Ошибка", MB_OK|MB_ICONWARNING);
                LocalFree(lpMsgBuf);
        }

// Wait until child process exits.
        WaitForSingleObject( pi.hProcess, INFINITE );

// Close process and thread handles.
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );

        return 0;
}



Но вот беда какая-то: не могу запихнуть в DWORD WINAPI WinXP( LPVOID lpParam) другие пути (т.е. что бы при определённои условии запускалась не ".\\BOOTDISK\\makebt32.exe a", а какие-нибудь другие програмки).
Делаю глобальную переменную, значение которой указвает на вариант выбора программы. В DWORD WINAPI WinXP( LPVOID lpParam) сразу после определения пространства имён делаю switch(...) {...} и определяю string-переменную, которая будет использоваться в curDir и cmd, и ей, в зависимости от выбранного варианта, присваиваю путь к программе. И всегда получаю out_of_range.

Автор: _hunter 27.3.2006, 10:46
ну так код вызова показывай.
+ с какого перепуга ты строку как void* передаеш? может проще ( и логичнее ) как char*/wchar_t* передавать?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)