Пытаюсь с помощью данной функции пытаюсь открыть приложение(путь указан верно, вместе с расширением .exe):
ShellExecute(NULL, "open", fullname.c_str(), NULL, NULL, SW_HIDE);
И в итоге у меня открывается целая куча копий:
ShellExecute считается устаревшей функцией и стоит использовать CreateProcess. Вот пример моей реализации:
bool Net::executeCommand(QString exe, QString command, LPDWORD lp)
{
// игнорировать предупреждения о non-initialized fields в si
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
STARTUPINFO si = {sizeof(si),0,};
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));
auto chr = strdup(command.toStdString().c_str());
size_t cSize = strlen(chr)+1;
wchar_t wc[cSize];
mbstowcs(wc, chr, cSize);
LPWSTR ptr = wc;
// осталось обрабатывать ошибки как - то
if (CreateProcess(reinterpret_cast<LPCWSTR>(exe.utf16()), ptr, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
{
delete[] ptr;
WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, lp);
return true;
}
else
{
delete[] ptr;
return false;
}
return true;
}
Пример вызова:
executeCommand(Net::GetWindowsPath() + "\\system32\\Mstsc.exe", "Mstsc /v:" + lpRemoteName, &lp)
А множественный запуск, я уверен, связан с тем, что Вы вызываете функцию не один раз. Чтобы проверить это, Вы можете создать пустой проект и там запустить свою функцию.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости