代码之家  ›  专栏  ›  技术社区  ›  Konrad

多个应用程序入口点

  •  2
  • Konrad  · 技术社区  · 16 年前

    最近,我试图通过创建一个额外的(DLLMain)入口点来将单元测试添加到一个已有的二进制文件中,这个入口点已经有了一个主入口点(它是一个控制台exe)。虽然我无法从python单元测试框架中将它作为DLL使用,但所有将exe作为DLL使用的尝试都失败了。

    有没有人有任何想法或经验,在添加额外的应用程序入口点的任何输入,为什么这会或不会工作?

    2 回复  |  直到 16 年前
        1
  •  3
  •   Oleg    16 年前

    • exe必须有重定位表(使用链接器开关/FIXED:NO)
    • exe必须导出至少一个函数-很清楚如何做到这一点。

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

    更新

    #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

    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
  •  1
  •   Community Mohan Dere    9 年前

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

    rundll32.exe