【插件开发】VC6.0要求将EXE改成DLL运行

今天遇到特殊的需求,就是要求将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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 WPF 中,你可以将 DLL 文件与程序本身封装在一起,只保留一个 EXE 文件。这可以通过使用 Costura.Fody 或者 ILMerge 等工具来实现。 Costura.Fody 是一个常用的 NuGet 包,可以将所有的 DLL 文件嵌入到 EXE 文件中。在使用 Costura.Fody 之前,你需要先安装它。然后,在项目中的 AssemblyInfo.cs 文件中添加以下代码: [assembly: Costura.AssemblyLoader("YourAssembly.dll")] 将 "YourAssembly.dll" 替换为你要嵌入的 DLL 文件。接下来,在项目的属性窗口中,将 "Embed all dependencies" 选项设置为 true。这样,在编译项目时,所有的 DLL 文件都会被嵌入到 EXE 文件中。 另一种方法是使用 ILMerge 工具。ILMerge 是一个独立的命令行工具,可以将多个程序集合并为一个。你可以在 Visual Studio 的 NuGet 包管理器控制台中使用以下命令来安装它: Install-Package ilmerge 安装完成后,打开 Visual Studio 的“工具”菜单,选择“外部工具”,然后点击“添加”按钮。在对话框中,将 "Title" 设置为 "ILMerge",将 "Command" 设置为 ILMerge 工具的路径(例如:C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe)。 接下来,在项目的属性窗口中,选择“生成事件”选项卡。在“后期生成事件命令行”中,添加以下命令: $(DevEnvDir)ilmerge.exe /target:winexe /out:YourOutput.exe YourMainAssembly.exe YourAssembly1.dll YourAssembly2.dll ... 将 "YourOutput.exe" 替换为输出的 EXE 文件名,将 "YourMainAssembly.exe" 替换为主程序集的路径,将 "YourAssembly1.dll"、"YourAssembly2.dll" 等替换为要合并的 DLL 文件的路径。 这样,通过使用 Costura.Fody 或者 ILMerge,你可以将 DLL 文件与程序本身封装在一起,只保留一个 EXE 文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侠客软件开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值