今天遇到特殊的需求,就是要求将EXE改成DLL运行,一开始遇到这个需求,是要把整个EXE工程改了。其实还有一种比较方法就是 将EXE直接嵌入到DLL的资源里面即可。然后调用方 直接用函数 LoadLibraryA 函数加载即可运行dll里面的exe 或 dat文件.具体代码如下。
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <process.h>
#include "resource.h" // 这个资源头文件 是在VC6.0 添加资源的时候自动产生
int __stdcall RunPlug( )
{
WinExec("gdi.dat",SW_NORMAL);
return 1;
}
BOOL __stdcall FreeMyResource(UINT uiResouceName, char* lpszResourceType, char* lpszSaveFileName ) //加法
{
HRSRC hRsrc = ::FindResourceA(GetModuleHandleA("gdi.dll"), MAKEINTRESOURCE(uiResouceName), lpszResourceType);
LPTSTR szBuffer = new TCHAR[1024];//这里是定义缓冲区大小
if (hRsrc == NULL)
{
// ::MessageBoxA(NULL, " 1 FindResourceA 函数调用失败 ", "x提示", MB_OK);
return FALSE;
}
DWORD dwSize = ::SizeofResource(GetModuleHandleA("gdi.dll"), hRsrc);
if (0 >= dwSize)
{
// ::MessageBoxA(NULL, " 2 SizeofResource 函数调用失败 ", "x提示", MB_OK);
return FALSE;
}
HGLOBAL hGlobal = ::LoadResource(GetModuleHandleA("gdi.dll"), hRsrc);
if (NULL == hGlobal)
{
//::MessageBoxA(NULL, " 3 LockResource 函数调用失败 ", "x提示", MB_OK);
return FALSE;
}
LPVOID lpVoid = ::LockResource(hGlobal);
if (NULL == lpVoid)
{
// ::MessageBoxA(NULL, " 4 LockResource 函数调用失败 ", "x提示", MB_OK);
return FALSE;
}
FILE* fp = fopen( lpszSaveFileName, "wb+");
if (NULL == fp)
{
// ::MessageBoxA(NULL, " 5 fp打开文件错误 ", "x提示", MB_OK);
return FALSE;
}
fwrite(lpVoid, sizeof(char), dwSize, fp);
fclose(fp);
return TRUE;
}
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
if ( dwReason== DLL_PROCESS_ATTACH ) //本DLL被加载后即释放出资源里面的二进制文件
{
char szSaveName[MAX_PATH] = "gdi.dat";
BOOL bRet = FreeMyResource(IDR_DAT1, "DAT", szSaveName); // 释放EXE文件 gdi.dat
if (bRet == TRUE )
{
RunPlug() ; //执行这个二进制文件
}
}
return TRUE;
}
// 有需要各种小工具插件开发的可以联系我Q 1016058890
完整VC6工程下载 https://download.csdn.net/download/i735740559/86742146