Используйте SHGetKnownFolderPath в пути CreateProcess для запуска программы - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь использовать функцию SHGetKnownFolderPath (), которая получает каталог localappdata пользователя и преобразует PWSTR (который является wchar_t *) в LPCSTR (который является const char *), затем добавляет программу в LPCSTRчтобы его можно было использовать в CreateProcess.

Я понял, как использовать SHGetKnownFolderPath и распечатать путь к консоли, используя printf (% ls%, путь), и выяснил, как использовать CreateProcess для выполнения файла .exe, но я не знаю, какпревратить PWSTR в const char * и включить программу, которую я хочу выполнить, в этот const char *.

#include <Windows.h>
#include <fstream>
#include <shlobj_core.h>
#include <string>
#include <KnownFolders.h>
#include <wchar.h>

int main () {
    //SHGetKnownFolderPath function
    PWSTR path = NULL;
    HRESULT path_here = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &path);

    //CreateProcess funtion
    STARTUPINFO info = { sizeof(info) };
    PROCESS_INFORMATION processInfo;
    const char* execute = //Want to have path_here plus another folder and an .exe program.
    BOOL create = CreateProcess(execute, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &info, &processInfo);
.......................
    }

Я бы не сказал, что знаю много о кодировании, и, вероятно, есть кое-что важное, что я наденупока не знаю.Любая помощь будет оценена.

РЕДАКТИРОВАТЬ

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

if (create){
    WaitForSingleObject(processInfo.hProcess, INFINITE);
    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);
 }

1 Ответ

1 голос
/ 31 марта 2019

Не конвертировать в char. SHGetKnownFolderPath() возвращает строку Unicode. Используйте CreateProcessW() явно, чтобы вы могли передать ему строку Unicode:

#include <Windows.h>
#include <fstream>
#include <shlobj_core.h>
#include <string>
#include <KnownFolders.h>
#include <wchar.h>

int main ()
{
    PWSTR path = NULL;
    HRESULT hres = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &path);
    if (SUCCEEDED(hres))
    {
        STARTUPINFOW info = { sizeof(STARTUPINFOW) };
        PROCESS_INFORMATION processInfo;
        std::wstring execute = std::wstring(path) + L"\\folder\\program.exe";
        CoTaskMemFree(path);
        BOOL create = CreateProcessW(&execute[0], NULL, NULL, NULL, FALSE, 0, NULL, NULL, &info, &processInfo);
        // ...
    }
    return 0;
}
...