Запустить .exe файл из ресурсов c++
У меня в ресурсах есть исполняемый(.exe)файл. Надо его скопировать на рабочий стол и выполнить. Вот мой код resource.h
//{{NO_DEPENDENCIES}}
// Used by Resource.rc
//
#define IDR_BIN1 132
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 133
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
и resource.rc
#include "resource.h"
IDR_BIN1 BIN DISCARDABLE "C:\\Users\\Admin\\Downloads\\test.exe"
и main.cpp
#include "resource.h"
#include <Windows.h>
#include <string>
#include <string_view>
#include <vector>
namespace {
class Resource {
public:
struct Parameters {
std::size_t size_bytes = 0;
void* ptr = nullptr;
};
private:
HRSRC hResource = nullptr;
HGLOBAL hMemory = nullptr;
Parameters p;
public:
Resource(int resource_id, const std::string &resource_class) {
hResource = FindResourceA(nullptr, MAKEINTRESOURCEA(resource_id), resource_class.c_str());
hMemory = LoadResource(nullptr, hResource);
p.size_bytes = SizeofResource(nullptr, hResource);
p.ptr = LockResource(hMemory);
}
auto& GetResource() const {
return p;
}
};
}
int main() {
return 0;
}
Ответы (1 шт):
Автор решения: Yakov
→ Ссылка
Вот пример рабочего кода. ( сохраняю дллку из ресурсов т.к. по требованиям системы нужно чтобы все данные были в одной длл).
bool writeResourceToFile(HMODULE hLibrary, int resNumber, std::fstream &fileWriter)
{
HRSRC hRes = FindResource(hLibrary, MAKEINTRESOURCE(resNumber), RT_RCDATA);
if (!hRes)
{
return false;
}
else
{
HGLOBAL hResource = LoadResource(hLibrary, hRes);
if (!hResource)
{
//FreeResource(hResource);
return false;
}
else
{
void *text = (LPWSTR)LockResource(hResource);
if (!text) {
FreeResource(hResource);
return false;
}
DWORD resourceSize = SizeofResource(hLibrary, hRes);
fileWriter.write((char*)text, resourceSize);
fileWriter.close();
FreeResource(hResource);
}
}
return true;
}
в мейне будет выглядеть примерно так:
int main() {
auto exeFile = std::fstream(...);
std::string filename = "path\\to\\file.exe";
if(writeResourceToFile(GetModuleHandle(), IDR_BIN1, exeFile))
system(filename.c_str()); // ну либо через ShellExecute() если ты не хочешь чтобы окно с интерпретатором появлялось. но для POC-кода привожу так.
return 0;
}