首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

dll中的过程引发异常后,Delphi FreeLibrary挂起

在Delphi开发中,DLL(Dynamic Link Library)是一种可重用的代码库,它包含了一些函数和过程,可以被应用程序动态加载和调用。在使用DLL时,有时会出现过程引发异常的情况,这可能导致应用程序崩溃或出现其他异常行为。

当DLL中的过程引发异常后,Delphi提供了FreeLibrary函数来卸载已加载的DLL,并释放相关资源。但是在调用FreeLibrary函数之前,可以使用挂起(Suspend)函数来暂停当前线程的执行,以便在调试或处理异常时进行相关操作。

挂起当前线程的目的是为了确保在释放DLL之前,不会有其他代码继续执行,从而避免在释放DLL时出现访问已释放内存的错误。通过挂起当前线程,可以保证在释放DLL之前,所有与该DLL相关的操作都已完成或中止。

需要注意的是,挂起当前线程是一种较为激进的操作,应该谨慎使用。在实际开发中,建议在处理DLL过程引发异常的情况时,先进行必要的异常处理和资源释放操作,然后再调用FreeLibrary函数来卸载DLL。

总结起来,当DLL中的过程引发异常后,可以通过Delphi的FreeLibrary函数来卸载已加载的DLL,并释放相关资源。在调用FreeLibrary函数之前,可以使用挂起函数来暂停当前线程的执行,以确保在释放DLL之前,不会有其他代码继续执行。需要注意谨慎使用挂起操作,并在异常处理和资源释放完成后再调用FreeLibrary函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Delphi中利用SEH屏蔽退出时的Runtime Error

Delphi写的程序,如果在单元的finalization里出现了一些异常操作会导致退出时抛出Runtime Error ,规范的处理办法当然是解决这些异常,但是有些特殊的情况下,比如用了很多的第三方控件,实在没办法解决问题时,只有把他屏蔽掉,这样给客户的时候就不至于看到满天的Runtime Error 了。 做法其实很简单,就是在 END.之前手工调用Halt释放,并且将Halt抛出的错误屏蔽掉,这样做和正常的DELPHI释放过程没有任何区别,因为End.编译后其实就是一句话 Call Halt0,只是VCL自己没有屏蔽Halt0里抛出的错误,而是跳出个Runtime Error 来;   首先就是位置的问题,如果是EXE的话,直接在END.之前就行了,如果是Dll的话就麻烦点,需要挂上DllProc,当wReason = DLL_PROCESS_DETACH时处理。 然后就是如何屏蔽错误的问题了,第一个最容易想到的做法就是直接 Try  halt except end;   但是这样是不行的,因为try…except end捕获的错误都会放到System单元的_HandleOnException中处理,函数检查错误类型是否是DelphiException,如果不是就不处理,这个时候就会被DELPHI的顶层异常机制捕获,并抛出Runtime error,halt里抛出来的错误恰恰就是非DelphiException,代码如下:  procedure _HandleOnException; …   CMP [EAX].TExceptionRecord.ExceptionCode,cDelphiException   JE @@DelphiException   CLD   CALL _FpuInit   MOV EDX,ExceptClsProc   TEST EDX,EDX   JE @@exit    CALL EDX   TEST EAX,EAX   JNE @@common   JMP @@exit … End; 所以,需要借助SHE机制来处理这个问题,代码如下:   asm    //挂上SEH xor edx, edx    push ebp   push OFFSET @@safecode   push dword ptr fs:[edx]   mov fs:[edx],esp   //调用Halt0   call Halt0   jmp @@exit;   @@safecode:    //如果出现异常继续调用Halt0退出 call Halt0;   @@exit:  end; 这个做法的好处就是,不会对DELPHI正常释放过程产生影响,所有的释放操作都是和VCL一致的,只是不会把错误显示出来。 以下是完整代码: 一、EXE的情况,把代码放在工程文件 procedure Halt0; begin Halt; end; begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; asm  xor edx, edx  push ebp  push OFFSET @@safecode   push dword ptr fs:[edx]  mov fs:[edx],esp   call Halt0  jmp @@exit;  @@safecode:   call Halt0;   @@exit: end; end.

04
领券