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

在Windows可执行文件中执行逻辑的最后一个位置是什么?

  •  4
  • Patrick  · 技术社区  · 14 年前

    在我的应用程序中,我想在最后一刻执行逻辑。越晚越好。

    这样做的原因是我跟踪应用程序中的某些元素(数据结构、资源等),在应用程序结束时,例程会检查这些元素和报表是否未正确关闭、释放、删除等。。。

    到目前为止,我们使用了一些技巧。

    第一个技巧是否决C运行时的\u heap\u term函数(以及C运行时中的一些其他函数)。这样做的好处是效果很好,但仅限于CRT静态链接的应用程序。

    第二个技巧是定义如下的全局变量:

    #pragma init_seg(lib)
    GlobalApplicationManager s_globalApplicationManager;
    

    这样,我们就可以将检查逻辑放入这个类的析构函数中。

    问题是从Windows7开始,在某些情况下不再调用析构函数。目前还不清楚是什么影响了这一点,但我们确信,如果在应用程序中成功建立Oracle连接,则不会调用它。

    在应用程序中,还有哪些技巧可以尽可能晚地执行代码?

    5 回复  |  直到 14 年前
        1
  •  7
  •   Ben Voigt    14 年前

    使用 /ENTRYPOINT

        2
  •  2
  •   Lior Kogan    14 年前

    我认为您应该尝试重构代码: 任何成员变量都应该在相关的类析构函数中进行析构函数。

    对于全局变量,可以定义销毁函数 void func() ,然后打电话 atexit(func) 初始化时。

        3
  •  1
  •   Richard    14 年前

    CRT定义了许多部分,您可以使用这些部分添加自己的呼叫 #pragma . 通过使用正确的名称,您可以在初始化和关闭过程的各个点添加代码。但是名字不容易找到。

    请查看VS2010安装的CRT源代码中的“crt0dat.c”以获取一些名称。

        4
  •  1
  •   MSalters    14 年前

    DllMain(DLL_PROCESS_DETACH) 帮助程序DLL中的函数。即使在EXE的入口点返回后也会发生这种情况(假设偶数返回-这可能不是由于 TerminateThread )所以这比本·沃伊特之前的建议更可靠,也更晚。

    不过,别以为你能做得太多。它几乎是最后一个可以执行逻辑的地方,但是你不能再依赖其他DLL了。这就是DLL\u进程\u分离的全部要点。您只能指望Kernel32.DLL被保留。

        5
  •  0
  •   C.J.    14 年前