多个应用程序入口点

2 投票
2 回答
1905 浏览
提问于 2025-04-16 00:50

最近,我在尝试给一个已经存在的程序添加单元测试。我想为这个程序创建一个额外的入口点(DLLMain),因为它已经有一个主入口点(它是一个控制台程序)。这个程序编译得似乎没问题,但我却无法在我的Python单元测试框架中把它当作DLL来使用,所有尝试把这个exe当作DLL使用的尝试都失败了。

有没有人有想法或者经验,能告诉我添加额外的程序入口点是否可行,或者为什么这样做会有效或无效?

2 个回答

1

我不太确定,但我猜Windows就是不允许在同一个进程中加载一个EXE文件和一个DLL文件,简单来说就是这样。

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

要在一个可执行文件中实现这两种行为,最简单的方法是把它设计成一个DLL,然后用rundll32.exe来独立执行它。这样就不需要自己写一个包装程序了。

3

要实现你想要的功能,有几个问题需要解决:

  • 这个可执行文件(exe)必须有重定位表(可以用链接器选项 /FIXED:NO 来设置)
  • 这个可执行文件至少要导出一个函数 - 这个比较简单,知道怎么做就行。

我建议使用 DUMPBIN.EXE 工具,不带任何选项(比如 /headers、/exports 这些),来检查 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"。

撰写回答