多个应用程序入口点
最近,我在尝试给一个已经存在的程序添加单元测试。我想为这个程序创建一个额外的入口点(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
"。