最近,我试图通过为已经有一个主入口点(它是一个控制台exe)的应用程序创建一个额外的(DLLMain)入口点,将单元测试添加到现有的二进制文件中。该应用程序似乎正确编译,虽然我无法将其用作我的python单元测试框架中的DLL,所有尝试使用exe作为dll失败。
是否有任何想法或经验可以添加额外的应用程序入口点以及为什么这样做或不起作用?
答案 0 :(得分:3)
要实现您想要的东西,您应该解决一些问题:
我建议使用DUMPBIN.EXE,不要使用某些开关(/ headers,/ exports和without switch)来检查exe标头。您可以将应用程序的结构与Winword.exe或outlook.exe进行比较,后者会导出一些函数。
如果所有这些都没有帮助,我会尝试编写一个测试EXE应用程序,可以作为exe加载并在此处发布代码。
更新:刚刚验证了我的建议。有用。 File 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
”。
答案 1 :(得分:1)
我不确定,但我猜想Windows只是拒绝加载EXE进程和DLL作为一个新进程,简单明了。
这些问题似乎包含更多细节:
在一个可执行映像中获取这两种行为的最简单方法是将其设计为DLL,然后使用rundll32.exe
独立执行它。没有必要编写自己的包装器。