Я использую переводчик. Надеюсь, это хороший переводчик) Я гость и иностранец. Это моя попытка быть вежливым. Пожалуйста, извините за любые ошибки.
Я изучал различные методы запуска программы. Все используют одни и те же методы, поэтому давайте попробуем что-то другое.
Я решил использовать IWshShell. IWshShell используется Visual Basic для запуска программ. Этот объект можно инициализировать на C++ для использования интерфейса Visual Basic. Это плохо документировано. Есть некоторая документация по нему 1990-х годов, но она плохая.
Вот мой код для проверки концепции. Его можно улучшить, другие перечисленные методы мне еще предстоит разработать. Я все еще экспериментирую с CreateShortcut, RegDelete, RegWrite, RegRead и ExpandEnvironmentVariables. Все перечисленные функции работают, но обеспечение их работоспособности в C++ может оказаться неприятным.
Хорошего дня =D
Я изучал различные методы запуска программы. Все используют одни и те же методы, поэтому давайте попробуем что-то другое.
Я решил использовать IWshShell. IWshShell используется Visual Basic для запуска программ. Этот объект можно инициализировать на C++ для использования интерфейса Visual Basic. Это плохо документировано. Есть некоторая документация по нему 1990-х годов, но она плохая.
Вот мой код для проверки концепции. Его можно улучшить, другие перечисленные методы мне еще предстоит разработать. Я все еще экспериментирую с CreateShortcut, RegDelete, RegWrite, RegRead и ExpandEnvironmentVariables. Все перечисленные функции работают, но обеспечение их работоспособности в C++ может оказаться неприятным.
Хорошего дня =D
C++:
#include <Windows.h>
#include <objidl.h>
#include <Propvarutil.h>
DWORD Win32FromHResult(_In_ HRESULT Result)
{
if ((Result & 0xFFFF0000) == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, 0))
return HRESULT_CODE(Result);
if (Result == S_OK)
return ERROR_SUCCESS;
return ERROR_CAN_NOT_COMPLETE;
}
struct __declspec(uuid("{f935dc21-1cf0-11d0-adb9-00c04fd58a0b}"))
IWshShell : public IUnknown {
virtual PVOID __stdcall CreateShortcut(PWCHAR) = 0;
virtual PWCHAR __stdcall ExpandEnvironmentString(PWCHAR) = 0;
virtual INT64 __stdcall Popup(PWCHAR, PVOID, PVOID) = 0;
virtual VOID __stdcall RegDelete(PWCHAR) = 0;
virtual HRESULT __stdcall RegRead(_In_ BSTR FullRegistryPath, _Out_ VARIANT* AllocatedReadValue) = 0;
virtual VOID __stdcall RegWrite(PWCHAR, PVOID, PVOID) = 0;
virtual DWORD __stdcall Run(_In_ BSTR BinaryPath, _In_opt_ VARIANT* WindowStyle, _In_opt_ VARIANT* WaitOnReturn, _Out_ PDWORD ExitCode) = 0;
};
INT main(VOID)
{
IWshShell* Shell = NULL;
HRESULT Result = S_OK;
GUID Clsid, Iid;
VARIANT wWindowStyle, wWaitOnReturn;
BSTR Payload = NULL;
BOOL bFlag = FALSE;
DWORD dwReturn = ERROR_SUCCESS;
DWORD dwExitCode = ERROR_SUCCESS;
wWaitOnReturn.vt = VT_EMPTY;
wWindowStyle.vt = VT_EMPTY;
Result = CLSIDFromString(L"{72C24DD5-D70A-438B-8A42-98424B88AFB8}", &Clsid);
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
Result = CLSIDFromString(L"{f935dc21-1cf0-11d0-adb9-00c04fd58a0b}", &Iid);
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
Result = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
Result = CoCreateInstance(Clsid, NULL, CLSCTX_ALL, Iid, (PVOID*)&Shell);
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
Payload = SysAllocString(L"C:\\Windows\\System32\\calc.exe");
if(Payload == NULL)
goto EXIT_ROUTINE;
if (Shell->Run(Payload, &wWindowStyle, &wWaitOnReturn, &dwExitCode) != ERROR_SUCCESS)
goto EXIT_ROUTINE;
bFlag = TRUE;
EXIT_ROUTINE:
if (!bFlag)
dwReturn = Win32FromHResult(Result);
if (Payload)
SysFreeString(Payload);
CoUninitialize();
return dwReturn;
}