инициализировать mysql с помощью функции Windows API CreateProcessA

avatar
H.K
8 апреля 2018 в 10:22
57
2
1

я пытаюсь инициализировать mysql под Windows 10 64Bit с помощью команды:

"D:\Test\Win32\Debug\mysqld.exe" --no-defaults --console --innodb-page-size=16384 --bootstrap "--lc-messages-dir=D:/Tests/Win32/Debug/share" --basedir=. --datadir=. --default-storage-engine=myisam --max_allowed_packet=9M --net-buffer-length=16k

Текущий каталог — D:\Tests\Win32\Debug\data.

если я запускаю команду из оболочки, проблем нет. Я написал программу на С++ с использованием embarcadero, а другую с использованием MVS 2013 с кодом:

SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES)};
sa.bInheritHandle      = TRUE;
assert(CreatePipe(&m_ro, &m_wo, &sa, 0));
assert(SetHandleInformation(m_ro, HANDLE_FLAG_INHERIT, 0));
assert(SetHandleInformation(m_wo, HANDLE_FLAG_INHERIT, 0));
assert(CreatePipe(&m_ri, &m_wi, &sa, 0));
assert(SetHandleInformation(m_ri, HANDLE_FLAG_INHERIT, 0));
assert(SetHandleInformation(m_wi, HANDLE_FLAG_INHERIT, 0));

STARTUPINFOA si = {sizeof(STARTUPINFOA)};
si.dwFlags     |= STARTF_USESTDHANDLES;
si.hStdInput    = m_ri;
si.hStdOutput   = m_wo;
si.wShowWindow  = SW_SHOWMAXIMIZED | SW_SHOWNORMAL;

assert(CreateProcessA(ApplicationName, CommandLine, NULL, NULL, true, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &m_pi));

Mysqld.exe завершает работу после вывода сообщения об ошибке: [Ошибка] 1105 Ошибка файла начальной загрузки, код возврата (32). Ближайший запрос: ''

Сначала я использую Mysql, а затем MariaDb. Оба пишут одно и то же сообщение об ошибке.

Источник
Rick James
29 апреля 2018 в 00:14
0

Почему --no-defalts??

Ответы (2)

avatar
Spektre
29 ноября 2019 в 14:45
0

У меня возникла та же проблема, что создание процесса с переключателями в Borland не работало так же, как в командной строке.

Я нашел способ обойти это, запустив сценарий командной строки вместо MySQL напрямую, и используя все переключатели в сценарии... Это временное решение, которое сработало для меня:

void Twin_main::server_on()
    {
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    SECURITY_ATTRIBUTES attr0,attr1;

    ZeroMemory(&si,sizeof(si));
    ZeroMemory(&pi,sizeof(pi));
    si.cb=sizeof(si);

    attr0.nLength=sizeof(SECURITY_ATTRIBUTES);
    attr0.bInheritHandle=TRUE;
    attr0.lpSecurityDescriptor=NULL;
    attr1=attr0;

    if (CreateProcess(NULL,"MySQL_start.cmd",&attr0,&attr1,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi))
        {
        }
    }

Где MySQL_start.cmd это:

cd ..\\MySQL Server 5.7.19
bin\mysqld --defaults-file="my.ini" --console

при размещении в том же каталоге, что и мое приложение exe, а MySQL находится на одну папку выше:

[MySQL Server 5.7.19]
 [bin]
  mysqld.exe
[MyApp]
 MyApp.exe
 MySQL_start.cmd

Попробуйте имитировать это, а затем просто перепишите MySQL_start.cmd, чтобы оно соответствовало тому, что вам нужно...

avatar
Vladislav Vaintroub
9 апреля 2018 в 09:17
0

Вы используете параметр --bootstrap. Тогда вы должны написать SQL-скрипт на стандартный ввод, но вы этого не сделаете. Чего вы пытаетесь достичь в конечном счете?

H.K
9 апреля 2018 в 09:51
0

Я хочу написать sql позже

Vladislav Vaintroub
9 апреля 2018 в 16:31
0

сделайте свою жизнь проще, просто используйте popen().