C 直接执行二进制资源

C 直接执行二进制资源,c,resources,executable,portability,C,Resources,Executable,Portability,lpBuffer是指向(二进制)资源的第一个字节的指针。如何在不将其转储到临时文件的情况下直接执行它 HMODULE hLibrary; HRSRC hResource; HGLOBAL hResourceLoaded; LPBYTE lpBuffer; hLibrary = LoadLibrary("C:\\xyz.exe"); if (NULL != hLibrary) { hResource = FindResource(hLibrary, MAKEINTRESOURCE(104

lpBuffer是指向(二进制)资源的第一个字节的指针。如何在不将其转储到临时文件的情况下直接执行它

HMODULE hLibrary;
HRSRC hResource;
HGLOBAL hResourceLoaded;
LPBYTE lpBuffer;

hLibrary = LoadLibrary("C:\\xyz.exe");
if (NULL != hLibrary)
{
    hResource = FindResource(hLibrary, MAKEINTRESOURCE(104), RT_RCDATA);
    if (NULL != hResource)
    {
        hResourceLoaded = LoadResource(hLibrary, hResource);
        if (NULL != hResourceLoaded)        
        {
            lpBuffer = (LPBYTE) LockResource(hResourceLoaded);            
            if (NULL != lpBuffer)            
            {                
                // do something with lpBuffer here            
            }
        }    
    }
    FreeLibrary(hLibrary);
}

Windows中没有为此内置的功能;您唯一的选项是
CreateProcess
,它接受一个EXE文件

您可以自己解析可执行文件格式。您将有效地重新创建
LoadLibrary
函数的功能

下面解释了如何加载DLL并调用其中的函数:。要使其适用于EXE,您需要遵循相同的重新定位和导入步骤。完成后,您将调用EXE的入口点。(本教程解释了如何调用DLL的导出函数。)


根据EXE中的内容,您可能无法将其直接加载到现有进程中。例如,您自己的EXE执行各种Win32和C初始化代码,嵌入的EXE可能会再次尝试执行相同的初始化。如果这成为一个问题,您的替代方案是将嵌入的EXE放在自己的进程中;然后,重新创建临时文件并调用
CreateProcess

Windows中没有为此内置的函数;您唯一的选项是
CreateProcess
,它接受一个EXE文件

您可以自己解析可执行文件格式。您将有效地重新创建
LoadLibrary
函数的功能

下面解释了如何加载DLL并调用其中的函数:。要使其适用于EXE,您需要遵循相同的重新定位和导入步骤。完成后,您将调用EXE的入口点。(本教程解释了如何调用DLL的导出函数。)

根据EXE中的内容,您可能无法将其直接加载到现有进程中。例如,您自己的EXE执行各种Win32和C初始化代码,嵌入的EXE可能会再次尝试执行相同的初始化。如果这成为一个问题,您的替代方案是将嵌入的EXE放在自己的进程中;然后,重新创建临时文件并调用
CreateProcess

如果资源是文件,那么就不可能了。如果它是一个简单的编译过程,请尝试的技巧

编辑: 更新的答案后,它将是最完整的答案。

如果资源是一个文件,那么就不可能了。如果它是一个简单的编译过程,请尝试的技巧

编辑:
在用户的答案更新之后,它是最完整的答案。

事情不是这样的。您不能只执行作为资源加载的代码。必须进行重新安置。导入必须解决。事情可能是这样的,因此我提出了“您的格式是什么”的问题。OP没有提到二进制资源中的内容。@wj32@Bubblegun我已经根据这些新信息重写了我的答案,谢谢你的输入。我来查一下教程。事情不是这样的。您不能只执行作为资源加载的代码。必须进行重新安置。导入必须解决。事情可能是这样的,因此我提出了“您的格式是什么”的问题。OP没有提到二进制资源中的内容。@wj32@Bubblegun我已经根据这些新信息重写了我的答案,谢谢你的输入。我来看看教程