Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Запуск и остановка внешнего BAT файла


Автор: XPyCT 11.9.2008, 11:31
всем участникам форума привет!

есть Java Эмулятор игрового сервера! имя ему Linеage

запуск  сервера происходит путем запуска по очереди двух батников
1. SartLoginserve.bat
2. StartGameserver.bat


содержимое SartLoginserve.bat
Код

@echo off
title Login Server Console
:start
echo Starting L2J Login Server.
echo.
java -Xmx128m  -cp ./../libs/*;l2jserver.jar net.sf.l2j.loginserver.L2LoginServer
if ERRORLEVEL 2 goto restart
if ERRORLEVEL 1 goto error
goto end
:restart
echo.
echo Admin Restart ...
echo.
goto start
:error
echo.
echo Server terminated abnormaly
echo.
:end
echo.
echo server terminated
echo.
pause



пытаюсь программно запустить этот логин сервер

таким макаром

Код


//глобальные переменные
STARTUPINFO cif1;
PROCESS_INFORMATION  pi1;

//клик по кнопке запуск
ZeroMemory(&cif1,sizeof(STARTUPINFO));
CreateProcess(NULL,Memo1->Lines->Strings[0].c_str(),NULL,NULL,FALSE,NULL,NULL,NULL,&cif1,&pi1);



код на остановку
Код

TerminateProcess(pi1.hProcess,NO_ERROR);


вот что он мне выдает


Код

Starting L2J Login Server.

Exception in thread "main" java.lang.NoClassDefFoundError: net/sf/l2j/loginserve
r/L2LoginServer
Caused by: java.lang.ClassNotFoundException: net.sf.l2j.loginserver.L2LoginServe
r
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

Server terminated abnormaly


server terminated

Для продолжения нажмите любую клавишу . . .



если запускать сервер в ручную тогда все проходит нормально

если кто знает как решить эту проблему - прошу помощи

за содействие отдельное спс mrBroks

вопрос пока открыт

Автор: HappyLife 11.9.2008, 12:50
XPyCT, А ты в качества файла в CreateProcess указываешь bat файл? Попробуй указывать CMD, а вот в качества параметра указать BAT.

Автор: XPyCT 11.9.2008, 12:59
такой метод приводит к такому же результату
ShellExecute(0,NULL,"D:/server/Kamael/login/startLoginServer.bat",NULL,NULL,3) ;

Добавлено через 33 секунды
Цитата(HappyLife @  11.9.2008,  12:50 Найти цитируемый пост)
XPyCT, А ты в качества файла в CreateProcess указываешь bat файл? Попробуй указывать CMD, а вот в качества параметра указать BAT.

щас попробую

Автор: XPyCT 11.9.2008, 13:17
не не помогло!
так запускае  cmd окно!
Код

ZeroMemory(&cif1,sizeof(STARTUPINFO));
CreateProcess("D:/server/Kamael/login/startLoginServer.bat","cmd.exe",NULL,NULL,FALSE,NULL,NULL,NULL,&cif1,&pi1);

а так вообще не запускает просто молчит и все
Код

ZeroMemory(&cif1,sizeof(STARTUPINFO));
CreateProcess("cmd.exe","D:/server/Kamael/login/startLoginServer.bat",NULL,NULL,FALSE,NULL,NULL,NULL,&cif1,&pi1);

Автор: 586 11.9.2008, 15:05
тестируй
Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    char cmd[] = "cmd.exe /с D:/server/Kamael/login/startLoginServer.bat";

    memset(&si, 0, sizeof(si));

    if(CreateProcess(0, cmd,
        NULL,NULL,FALSE,NULL,NULL, "D:/server/Kamael/login",&si,&pi))
    {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }
}

Автор: XPyCT 11.9.2008, 15:26
586 вот что в окне выдало
Код

"amael" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

D:\server\Kamael\login>




вот так еще сделал
Код


char cmd[] = "cmd.exe /n D://server//kamael//login//startLoginServer.bat";
    memset(&si, 0, sizeof(si));
    if(CreateProcess(0, cmd,
        NULL,NULL,FALSE,NULL,NULL, "D://server//Kamael//login",&si,&pi))
    {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }


тоже самое

Автор: mrbrooks 11.9.2008, 15:28
586,  комрад пути видимо идут с \\  smile 

Автор: XPyCT 11.9.2008, 15:57
вобщем решил вот так
в массив чар не нужно писать путь полный

Код

char cmd[] = "cmd.exe /c startLoginServer.bat";
    memset(&si, 0, sizeof(si));
    if(CreateProcess(0, cmd,
        NULL,NULL,FALSE,NULL,NULL, "D:\\server\\Kamael\\login",&si,&pi))
    {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }


всем спс!
тема закрыта соответственно в репу

Автор: Alca 11.9.2008, 16:39
1. Что возвращает GetLastError()?
2. А если батник лежит в другом каталоге?
3. Если в пути встречаются пробелы то надо брать в ковычки:
Код

char cmd[] = "cmd.exe /c \"D://server foder//kamael//login//startLoginServer.bat\"";

Автор: XPyCT 11.9.2008, 18:50
Цитата(Alca @ 11.9.2008,  16:39)
1. Что возвращает GetLastError()?
2. А если батник лежит в другом каталоге?
3. Если в пути встречаются пробелы то надо брать в ковычки:
Код

char cmd[] = "cmd.exe /c \"D://server foder//kamael//login//startLoginServer.bat\"";

вот именно так и не работает
char cmd[] = "cmd.exe /c \"D://server foder//kamael//login//startLoginServer.bat\"";

а так работает
char cmd[] = "cmd.exe /c startLoginServer.bat";

Автор: XPyCT 11.9.2008, 19:55
блин вот поторопился радоватся! 
как теперь это закрыть- остановить?

этот код на вырубание уже не пашет
Код

TerminateProcess(pi.hProcess,NO_ERROR);

Автор: 586 11.9.2008, 21:05
Цитата(mrbrooks @  11.9.2008,  16:28 Найти цитируемый пост)
пути видимо идут с \\

И с '/' может работать. Просто я оставил "стилистику" автора.

Цитата(XPyCT @  11.9.2008,  19:50 Найти цитируемый пост)
char cmd[] = "cmd.exe /c \"D://server foder//kamael//login//startLoginServer.bat\"";

XPyCT, нужно ставить обратные слэши - char cmd[] = "cmd.exe /c \"D:\\server foder\\kamael\\login\\startLoginServer.bat\"";
Твой путь хоть и рабочий, но не правильный.

Цитата(XPyCT @  11.9.2008,  20:55 Найти цитируемый пост)
как теперь это закрыть- остановить?

этот код на вырубание уже не пашет
Код
TerminateProcess(pi.hProcess,NO_ERROR);

Возможно, дескриптор был закрыт функцией CloseHandle.
Вызывай CloseHandle после TerminateProcess а не перед.

PS: TerminateProcess - зло. Я бы задумался о других вариантах. К тому же, процесс java.exe не завершится.

Автор: XPyCT 12.9.2008, 08:57
586!
плз покажи пример как закрыть
вообще уже башка суппер в квадрате ))) и день и ночь!
с меня 100гр и пончик(в виде репы)   smile 

Автор: mrbrooks 12.9.2008, 11:06
XPyCT
Код

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

Автор: XPyCT 12.9.2008, 11:41
Цитата
"cmd.exe /c \"D:\\server foder\\kamael\\login\\startLoginServer.bat\"";

не работает так просто мельком проскакивает и все

mrbrooks
по поводу закрытия пишет
Код

External exception c0000008



Автор: XPyCT 12.9.2008, 13:28
в общем вопрос с закрытием решил потем поиска  )))
за основу взял этот код по этому адресу http://www.sysman.ru/index.php?showtopic=5820
вот сам код
Код

#include <Tlhelp32.h>
BOOL Kill(char * procname)
{
 #define PROCESS_TERMINATE (0x0001)
 BOOL ContinueLoop;
 HANDLE FSnapshotHandle;
 PROCESSENTRY32 FProcessEntry32;
 FSnapshotHandle = CreateToolhelp32Snapshot(
                                            TH32CS_SNAPPROCESS,
                                            0);
 FProcessEntry32.dwSize = sizeof(FProcessEntry32);
 ContinueLoop = Process32First(FSnapshotHandle, &FProcessEntry32);
 while (int(ContinueLoop) != 0 )
       {
        if (
           (UpperCase(ExtractFileName(FProcessEntry32.szExeFile))
           ==
           (UpperCase(procname))
           |
           (
           UpperCase(FProcessEntry32.szExeFile)==
           UpperCase(procname))
           )
           )
           {
            return int( TerminateProcess
                        (OpenProcess(PROCESS_TERMINATE,
                        BOOL(0),
                        FProcessEntry32.th32ProcessID),
                        0));
           }
        ContinueLoop = Process32Next(FSnapshotHandle,&FProcessEntry32);

       }
 CloseHandle(FSnapshotHandle);
}
//Пример вызова:
void __fastcall TForm1::btnKillClick(TObject *Sender)
{
 String s = ExtractFileName(Application->ExeName.c_str());
 Kill(s.c_str());



саму функцию я перенес в отдельный заголовочный файл

а закрываю путем отбращения к ней  Kill(s.c_str());
всем спс
вот теперь тема закрыта

Автор: Alca 12.9.2008, 23:30
...

Автор: XPyCT 13.9.2008, 08:07
Цитата(Alca @ 12.9.2008,  23:30)
дел

не понял вас! что означает дел? что удалить что поправить

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