多个应用程序入口点

Posted

技术标签:

【中文标题】多个应用程序入口点【英文标题】:Multiple application entry points 【发布时间】:2010-07-05 10:49:40 【问题描述】:

最近我试图通过为已经具有主入口点(它是控制台 exe)的应用程序创建一个额外的 (DLLMain) 入口点来向现有二进制文件添加单元测试。尽管我无法从我的 python 单元测试框架中将它用作 DLL,但应用程序似乎编译正确,所有尝试将 exe 用作 dll 的尝试都失败了。

有没有人有任何想法或经验来添加额外的应用程序入口点以及为什么这会或不会起作用?

【问题讨论】:

【参考方案1】:

你应该解决一些问题来实现你想要的:

exe 必须有重定位表(使用链接器开关 /FIXED:NO) exe 必须导出至少一个函数 - 很清楚如何执行此操作。

我建议使用不带任何开关(/headers、/exports 和不带开关)的 DUMPBIN.EXE 来检查 exe 标头。您可以将应用程序的结构与导出某些功能的 Winword.exe 或 Outlook.exe 进行比较。

如果这一切都没有帮助,我将尝试编写一个可以作为 exe 加载的测试 EXE 应用程序并在此处发布代码。

更新:刚刚验证了我的建议。有用。文件 Loadable.c 如下所示

#include <windows.h>
#include <stdio.h>

EXTERN_C int __declspec(dllexport) WINAPI Sum (int x, int y);

EXTERN_C int __declspec(dllexport) WINAPI Sum (int x, int y)

    return x + y;


int main() 

    printf ("2+3=%d\n", Sum(2,3));

唯一重要的链接器开关是/FIXED:NO,可以在链接器设置的高级部分找到。该程序可以运行并产生输出“2+3=5”。

另一个EXE将EXE加载为DLL并调用Sum函数:

#include <windows.h>
#include <stdio.h>

typedef int (WINAPI *PFN_SUM) (int x, int y);

int main()

    HMODULE hModule = LoadLibrary (TEXT("C:\\Oleg\\ExeAsDll\\Loadable.exe"));
    PFN_SUM fnSum = (PFN_SUM) GetProcAddress (hModule, "_Sum@8");
    int res = fnSum (5,4);
    printf ("5+4=%d\n", res);
    return 0;

程序还可以运行并产生输出“5+4=9”。

【讨论】:

【参考方案2】:

我不确定,但我猜 Windows 只是拒绝加载进程内 EXE 和 DLL 作为新进程,简单明了。

这些问题似乎包含更多细节:

Can the DllMain of an .exe be called? DllMain in an exe?

在一个可执行映像中获取这两种行为的最简单方法是将其设计为 DLL,然后使用 rundll32.exe 独立执行它。无需编写自己的包装器。

【讨论】:

以上是关于多个应用程序入口点的主要内容,如果未能解决你的问题,请参考以下文章

如何使用具有多个入口点的 Webpack 和 Gulp 来转换应用程序和测试目录?

C#提示不只定义了一个入口点,请使用/main进行编译以指定包含入口点的类型

如何使用具有多个页面和入口点的 React 和 TypeScript 设置 chrome 扩展?

使用 AOT 的 Angular 多入口点

Main() 方法

Snowpack 的多个入口点