1 Востаннє редагувалося Betterthanyou (18.03.2018 22:17:40)

Тема: Не можу відкрити sound recorder

Windows 8 (не 8.1)
Visual Studio 15
Якщо зайти в "Run" (win + r) і ввести команду "soundrecorder", то sound recorder відкривається. (тобто програма є)
GetLastError повертає 2 (ERROR_FILE_NOT_FOUND)

Ось код, якщо замінити sound recorder на calc або notepad то код працює, якщо замінити на soundrecorder - ні. Не розумію в чому проблема

    LPCTSTR lpApplicationName = "c:\\windows\\system32\\soundrecorder.exe";
    PROCESS_INFORMATION lpProcessInformation;
    STARTUPINFO lpStartupInfo;
    ZeroMemory(&lpProcessInformation, sizeof(lpProcessInformation));
    ZeroMemory(&lpStartupInfo, sizeof(lpStartupInfo));
    lpStartupInfo.cb = sizeof(lpStartupInfo);
    lpStartupInfo.dwFlags = STARTF_USESHOWWINDOW;

    BOOL wasCreatedProcess = CreateProcess(
        lpApplicationName,
        NULL,
        NULL,
        NULL,
        TRUE,
        NULL,
        NULL,
        NULL,
        &lpStartupInfo,
        &lpProcessInformation
    );

    if (wasCreatedProcess)
    {
        MessageBox(
            NULL,
            "OK",
            "Message Box",
            MB_OK
        );
    }
    else
    {
        #define lastErrBuffer 128
        char *lastErr;
        FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
            NULL,
            GetLastError(),
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR)&lastErr,
            lastErrBuffer,
            NULL
        );
        MessageBox(
            NULL,
            lastErr,
            "Message Box",
            MB_OK
        );
        LocalFree(lastErr);
        #undef lastErrBuffer
    }

    Sleep(10000);

Чому не можу відкрити "sound recorder" ? Як це виправити ?

Подякували: leofun011

2

Re: Не можу відкрити sound recorder

Я віндою не користуюся а запускати виртуалку лінь  -за вказаним шляхом - c:\\windows\\system32\\soundrecorder.exe файл існує? Скористайтися пошуком, можливо він знаходиться у другому місті - наприклад Program Files\WindowsNT

3 Востаннє редагувалося Betterthanyou (18.03.2018 23:30:03)

Re: Не можу відкрити sound recorder

Так, існує. Якщо ввести c:\windows\system32\soundrecorder.exe у File Explorer, то відкривається програма. Якщо знайти програму в c:\windows\system32\ і подивитися Location: C:\Windows\System32
Пробував з врахуванням регістру і без, завжди помилка "2"

(Як я і казав calc i notepad відкривається, тому це якось дивно...)

та ж ситуація з другим параметром lpCommandLine, якщо ввести calc (не шлях, а просто calc) - працює, a soundrecorder - ні.

Пробував system("soundrecorder"); - не працює...

4

Re: Не можу відкрити sound recorder

    LPCTSTR lpApplicationName = "soundrecorder";
    LPCTSTR lpApplicationCommandLine = "c:\\windows\\system32\\soundrecorder.exe";

    PROCESS_INFORMATION lpProcessInformation;
    STARTUPINFO lpStartupInfo;
    ZeroMemory(&lpProcessInformation, sizeof(lpProcessInformation));
    ZeroMemory(&lpStartupInfo, sizeof(lpStartupInfo));
    lpStartupInfo.cb = sizeof(lpStartupInfo);
    lpStartupInfo.dwFlags = STARTF_USESHOWWINDOW;
 
    BOOL wasCreatedProcess = CreateProcess(
        lpApplicationName,
        lpApplicatonCommandLine,
        NULL,
        TRUE,
        NULL,
        NULL,
        NULL,
        &lpStartupInfo,
        &lpProcessInformation
    );
 

перший параметр можна взагалі не задавати.

5

Re: Не можу відкрити sound recorder

А в C:\Windows\SysWOW64 заглядали?

6 Востаннє редагувалося Betterthanyou (19.03.2018 13:20:52)

Re: Не можу відкрити sound recorder

В "C:\Windows\SysWOW64" немає такої програми, я також щойно спробував програмно дізнатися директорію за допомогою "GetSystemDirectory" - також не допомогло.

#define sysDirBuffer 256

BOOL wasGotSystemDirectory;
    LPTSTR lpBuffer = new TCHAR[sysDirBuffer];
    UINT uSize(sysDirBuffer);
    wasGotSystemDirectory = GetSystemDirectory(lpBuffer, uSize);
    if (!wasGotSystemDirectory)
    {
        MessageBox(
            NULL,
            "Fail",
            "Message Box",
            MB_OK
        );
    }
    
    strcat_s(lpBuffer, sysDirBuffer, "\\SoundRecorder.exe");

    LPCTSTR lpApplicationName = lpBuffer;

Зробив release build і запустив із правами адміністратора, і це не допомогло

Оскільки програма sound recorder не багато займає місця, скопіював її у директорію з моєю програмою та змінив шлях до виконуваного файлу, тепер запускається.

До речі C# запускає з c:\windows\system32

static void Main(string[] args)
        {
            Process.Start("soundrecorder");
        }

Проблема частково вирішена, але якщо хтось знає чому C++ відмовляється знаходити цю програму - пишіть

Це версія програми до коду з шляхом c:\windows\system32\SoundRecorder.exe
https://drive.google.com/open?id=1Ix0-a … jEeKHIPWSo - exe
Я не закривав процес! тому якщо раптом запуститься, прийдеться закривати task менеджером

7

Re: Не можу відкрити sound recorder

Спробуйте змінити "\\" на /.

8

Re: Не можу відкрити sound recorder

Betterthanyou написав:

Проблема частково вирішена, але якщо хтось знає чому C++ відмовляється знаходити цю програму - пишіть

Ви спробували запустити мій варіант?

9 Востаннє редагувалося Betterthanyou (19.03.2018 16:09:59)

Re: Не можу відкрити sound recorder

varkon так, пробував, не працює
LoganRoss і це не допомагає
Завжди помилка "2"

Також щойно спробував змінити компілятори (пробував MiniGW, Embarcadero Technologies Builder C++)

Змінив щойно кодування символів "Debug" -> "Properties" -> "Character Set" -> "Use Unicode ..."
І в коді

#include <Windows.h>
#include <cstring>
#define sysDirBuffer 256

void showError()
{
    #define lastErrBuffer 128
    wchar_t *lastErr;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR)&lastErr,
        lastErrBuffer,
        NULL
    );
    MessageBox(
        NULL,
        lastErr,
        L"Error Box",
        MB_OK
    );
    LocalFree(lastErr);
    #undef lastErrBuffer
}

int CALLBACK WinMain(
    _In_ HINSTANCE hInstance,
    _In_ HINSTANCE hPrevInstance,
    _In_ LPSTR     lpCmdLine,
    _In_ int       nCmdShow
)
{
    BOOL wasGotSystemDirectory;
    LPTSTR lpBuffer = new TCHAR[sysDirBuffer];
    UINT uSize(sysDirBuffer);
    wasGotSystemDirectory = GetSystemDirectory(lpBuffer, uSize);
    if (!wasGotSystemDirectory)
    {
        showError();
    }
    
    wcscat_s(lpBuffer, sysDirBuffer, L"\\SoundRecorder.exe");
    
    LPCTSTR lpApplicationName = lpBuffer;
    PROCESS_INFORMATION lpProcessInformation;
    STARTUPINFO lpStartupInfo;
    ZeroMemory(&lpProcessInformation, sizeof(lpProcessInformation));
    ZeroMemory(&lpStartupInfo, sizeof(lpStartupInfo));
    lpStartupInfo.cb = sizeof(lpStartupInfo);
    lpStartupInfo.dwFlags = STARTF_USESHOWWINDOW;
    lpStartupInfo.wShowWindow = SW_SHOW;

    BOOL wasCreatedProcess = CreateProcessW(
        lpApplicationName,
        NULL,
        NULL,
        NULL,
        TRUE,
        NULL,
        NULL,
        NULL,
        &lpStartupInfo,
        &lpProcessInformation
    );

    if (wasCreatedProcess)
    {
        MessageBox(
            NULL,
            L"Process was opened",
            L"Message Box",
            MB_OK
        );
    }
    else
    {
        showError();
    }

    Sleep(10000);

    return 0;
}

також не допомогло

Відлагодка
http://replace.org.ua/misc.php?action=pun_attachment&amp;item=1772&amp;download=0

Post's attachments

Untitled.png 31.01 kb, 147 downloads since 2018-03-19 

Подякували: LoganRoss1

10

Re: Не можу відкрити sound recorder

Можливо, для доступу до системних файлів потрібен інший спосіб. Спробуйте функцію SHGetSpecialFolderPath або %windir%\system32

11

Re: Не можу відкрити sound recorder

SHGetSpecialFolderPath is not supported https://msdn.microsoft.com/uk-ua/librar … S.85).aspx
%windir%\system32 пробував і %systemroot%\system32, не допомагає

А хтось програму запускав ? У вас працює ?

12

Re: Не можу відкрити sound recorder

Betterthanyou написав:

А хтось програму запускав ? У вас працює ?

До речі про "хтось запускав". Незнаю як тут, але загалом на нормальних прогерських форумах, якщо користувач без особливого прохання викладає екзешнік, то він отримує попередження як мінімум.
Хочите щоб вам допомагали  - викладайте проєкт, хто захоче той збере сам.

Подякували: ReAl1

13 Востаннє редагувалося Betterthanyou (19.03.2018 22:42:19)

Re: Не можу відкрити sound recorder

Так я вже показав проект(один файл).

#include <Windows.h>
#include <cstring>
#define sysDirBuffer 256
 
void showError()
{
    #define lastErrBuffer 128
    wchar_t *lastErr;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR)&lastErr,
        lastErrBuffer,
        NULL
    );
    MessageBox(
        NULL,
        lastErr,
        L"Error Box",
        MB_OK
    );
    LocalFree(lastErr);
    #undef lastErrBuffer
}
 
int CALLBACK WinMain(
    _In_ HINSTANCE hInstance,
    _In_ HINSTANCE hPrevInstance,
    _In_ LPSTR     lpCmdLine,
    _In_ int       nCmdShow
)
{
    BOOL wasGotSystemDirectory;
    LPTSTR lpBuffer = new TCHAR[sysDirBuffer];
    UINT uSize(sysDirBuffer);
    wasGotSystemDirectory = GetSystemDirectory(lpBuffer, uSize);
    if (!wasGotSystemDirectory)
    {
        showError();
    }
    
    wcscat_s(lpBuffer, sysDirBuffer, L"\\SoundRecorder.exe");
    
    LPCTSTR lpApplicationName = lpBuffer;
    PROCESS_INFORMATION lpProcessInformation;
    STARTUPINFO lpStartupInfo;
    ZeroMemory(&lpProcessInformation, sizeof(lpProcessInformation));
    ZeroMemory(&lpStartupInfo, sizeof(lpStartupInfo));
    lpStartupInfo.cb = sizeof(lpStartupInfo);
    lpStartupInfo.dwFlags = STARTF_USESHOWWINDOW;
    lpStartupInfo.wShowWindow = SW_SHOW;
 
    BOOL wasCreatedProcess = CreateProcessW(
        lpApplicationName,
        NULL,
        NULL,
        NULL,
        TRUE,
        NULL,
        NULL,
        NULL,
        &lpStartupInfo,
        &lpProcessInformation
    );
 
    if (wasCreatedProcess)
    {
        MessageBox(
            NULL,
            L"Process was opened",
            L"Message Box",
            MB_OK
        );
    }
    else
    {
        showError();
    }
 
    Sleep(10000);
 
    return 0;
}