我试图从互联网上下载更新的文件并打开它。目前我通过将文件下载到磁盘来工作,我想知道是否有可能将文件下载到char数组然后以某种方式从内存中打开文件?
有时我的文件将是一个exe(更新当前程序),有时只是一个带有新用法信息的文本文件。
下载时我必须将文件读入内存,但我不确定从内存中打开该文件的位置。
#include <ShlObj.h>
#include <urlmon.h>
#include <atlbase.h> // CComPtr
bool downloadToMemory(){
char* fileBuffer = 0;
ComInIt init;
CComPtr<IStream> pStream;
// Open HTTP Request
HRESULT hr = URLOpenBlockingStream(nullptr, host.c_str(), &pStream, 0, nullptr);
if (FAILED(hr))
{
return false;
}
else
{
DWORD bytesRead = 1;
std::size_t total = 0;
while(bytesRead > 0 && hr != S_FALSE)
{
// Dynamically increase buffer size
fileBuffer = (char*)realloc(fileBuffer, bytesRead + 4096 * sizeof(char));
hr = pStream->Read(fileBuffer, sizeof(fileBuffer), &bytesRead);
total += bytesRead;
}
// Do something here with fileBuffer
}
很容易将IStream送到内存区域,为此使用SHCreateMemStream。但是,如果你想要的'文件打开'实际上是ShellExecute来调用那种文件的默认行为(就像我期望的那样.exe),它必须在某处写入磁盘。