分两种方式实现C++和C
int read_dll_memory_load (TCHAR str_dll_path[],char str_export_fun[]) //用C++的方式把文件读到内存加载
{
filebuf *pbuf;
ifstream filestr;
long size;
char * buffer;
filestr.open (str_dll_path, ios::binary); // 要读入整个文件,必须采用二进制打开
pbuf=filestr.rdbuf(); // 获取filestr对应buffer对象的指针
size=pbuf->pubseekoff (0,ios::end,ios::in); // 调用buffer对象方法获取文件大小
pbuf->pubseekpos (0,ios::in);
buffer=new char[size]; // 分配内存空间
pbuf->sgetn (buffer,size); // 获取文件内容
filestr.close();
HMEMORYMODULE module=MemoryLoadLibrary(buffer);//从内存中加载文件
FARPROC mc=MemoryGetProcAddress(module, str_export_fun);
if (mc==NULL)
{
OutputDebugStringA("MemoryGetProcAddress NULL");
return 0;
}
typedef int (WINAPI* FN_Execute) (int nType);
FN_Execute execute=(FN_Execute)mc;
execute(0);
MemoryFreeLibrary(module);
delete []buffer;
return 0;
}
UINT read_dll_memory_load_c(TCHAR str_dll_path[],char str_export_fun[])
{
HANDLE hFile = CreateFile(str_dll_path, GENERIC_READ , 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile==NULL||hFile==INVALID_HANDLE_VALUE)
{
return 0;
}
DWORD dwFileSize= 0;
dwFileSize=GetFileSize(hFile, NULL);
CloseHandle(hFile);
char * buff=new char[dwFileSize];
FILE* fp = _tfopen(str_dll_path, _T("rb"));
if (fp)
{
dwFileSize=fread(buff, 1, dwFileSize, fp);
}
fclose(fp);
HMEMORYMODULE hm=MemoryLoadLibrary(buff);
if (hm==NULL)
{
return 0;
}
FARPROC mc=MemoryGetProcAddress(hm, str_export_fun);
if (mc==NULL)
{
OutputDebugStringA("MemoryGetProcAddress NULL");
return 0;
}
typedef int (WINAPI* FN_Execute) (int nType);
FN_Execute execute=(FN_Execute)mc;
execute(0);
MemoryFreeLibrary(hm);
delete []buff;
return 0;
}
本文探讨了如何在C++和C语言中将文件内容读取到内存,并进行详细的操作步骤,覆盖了两种编程语言的不同实现方法。
3221

被折叠的 条评论
为什么被折叠?



