这两天写了一个 ActiveX 控件,实现加载一个 EXE,然后再创建一个 EXE。以前没有写过 ActiveX,所以做个记录当备份吧。
用的 VS2013,WIN7 64 旗舰版,首先创建一个 MFC ActiveX 项目。创建项目网上很多图片演示,就不放图了,创建完成把需要加载的 EXE 添加到资源里面,设定好类型。
// HINSTANCE hInstance = ::AfxGetResourceHandle(); // 获取句柄
// HRSRC res_Port = FindResource(hInstance,MAKEINTRESOURCE(IDR_BIN1), “BIN”); // 寻找资源
// if (!res_Port)
// {
// MessageBox(“未找到”);
// }
// HGLOBAL gld_Port = LoadResource(hInstance, res_Port); // 读取资源
// if (gld_Port == NULL)
// {
// MessageBox(“未加载”);
// }
//
// DWORD dwPortDataLength = SizeofResource(hInstance, res_Port);// 获取资源字节数大小
// if (dwPortDataLength == NULL)
// {
// MessageBox(“获取失败”);
// }
//
// LPVOID pKernel = LockResource(gld_Port); // 查找,加载,锁定资源
//
// if (pKernel == NULL)
// {
// MessageBox(“锁定失败”);
// }
// unsigned char * PortData = new unsigned char[dwPortDataLength]; // 开辟内存
// memcpy(PortData, pKernel, dwPortDataLength); // 拷贝
//
//
// UnlockResource(pKernel);
// FreeResource(gld_Port);//
这样 ,程序就读到内存里面了,下面可以把内存里的东西重新创建文件写出来。
char Path[MAX_PATH] = { "C:\\123.exe" };
HANDLE FileHandle = CreateFile(Path, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
if (FileHandle == INVALID_HANDLE_VALUE)//创建文件失败
{
return;
}
DWORD aa = 0;
if (!WriteFile(FileHandle, PortData, dwPortDataLength, &aa, NULL))
{
CloseHandle(FileHandle);//失败后关闭句柄
return;
}
CloseHandle(FileHandle);//成功后关闭句柄
return;
可以不要上面的资源加载的东西,只要下面的读写文件的东西,然后在写一个配置器,把需要加载到 ActiveX 里面的程序内存,大小配置到 ActiveX 写的文件里面,这样就可以随时替换了。