我通过使用资源(按照这里的说明)实现了我的目标。
以下是我如何使其工作的步骤。(我对C++比较新,如果你发现任何愚蠢的地方,请告诉我。)
- 将托管代码编译为单个文件
- 将托管代码可执行文件重命名为.txt文件
- 创建一个新的Visual C++ Win32控制台应用程序
- 添加新项-资源文件(.rc)
- 打开资源文件,添加资源,选择导入,输入“TEXT”作为类型
- 修改"DWORD size"以匹配托管.txt文件的大小
其余的可以通过代码转储来解释。
希望这能对某些人有所帮助(像我这样的C++新手...)
#include "stdafx.h"
#include "resource.h"
#include "windows.h"
#include "iostream"
#include <string>
#include <sstream>
using namespace std;
namespace std
{
HRSRC hrsrc = NULL;
HGLOBAL hGlbl = NULL;
BYTE *pExeResource = NULL;
HANDLE hFile = INVALID_HANDLE_VALUE;
DWORD size = 8192;
HINSTANCE g_Handle = NULL;
HINSTANCE hInstance = NULL;
template <typename T>
string NumberToString(T pNumber)
{
ostringstream oOStrStream;
oOStrStream << pNumber;
return oOStrStream.str();
}
}
int _tmain(int argc, _TCHAR* argv[])
{
hrsrc = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_TEXT1), _T("TEXT"));
if (hrsrc == NULL)
{
cout << "hrsc is null! \n";
cin.get();
return FALSE;
}
hGlbl = LoadResource(hInstance, hrsrc);
if (hGlbl == NULL)
{
cout << "hGlbl is null! \n";
cin.get();
return FALSE;
}
pExeResource = (BYTE*)LockResource(hGlbl);
if (pExeResource == NULL)
{
cout << "pExeResource is null! \n";
cin.get();
return FALSE;
}
hFile = CreateFile(L"ManagedCode.exe", GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
DWORD bytesWritten = 0;
WriteFile(hFile, pExeResource, size, &bytesWritten, NULL);
CloseHandle(hFile);
}
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
int ret = CreateProcess(L"ManagedCode.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (ret == 1) { return 0; }
else
{
cout << "CreatePrecess returns " + NumberToString(ret) + ". \n";
cin.get();
}
return 0;
}
Resource.h - 这是在使用VS2013的GUI导入资源时,自动生成的,连同对Recource.rc的修改一起生成。
#define IDR_TEXT1 101
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
我需要补充一些其他的东西,这些东西必须更改才能在Windows XP上运行:
- 确保平台目标为Win32
- 将 配置属性>常规>平台工具集 设置为 "Visual Studio 2013 - Windows XP (x120_xp)"
- 将 配置属性>C/C++>代码生成>运行库 设置为 "多线程(/MT)