首页
学习
活动
专区
工具
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函数。

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

相关·内容

VC下提前注入进程的一些方法1——远线程不带参数

先说下我代码风格,因为要处理很多异常逻辑,我比较喜欢do{}while(0);这样的结构,一旦出错,就break出来。...DLL在载入过程或者其他会被执行到的地方执行相关逻辑(如Hook API)。根据需要,可以考虑在远线程执行完毕后,再使用远线程把被注入进程加载的DLL卸载掉。        ...在申请空间成功后,使用WriteProcessMemory向刚申请的空间中写入DLL的路径。这儿说一下DLL路径问题,因为Windows在寻找路径的问题上存在一定策略。...远线程是在被注入进程中执行的,那么远线程Load的DLL文件的文件句柄应该在被注入进程的地址空间中,我们在注入进程中获得它也不能操作啊?...我想很多做这块的人都发现过,在xp中以挂起方式创建的进程,在被执行完远线程并线程退出后,恢复主线程会导致主进程退出。

88320

如何解决在DLL的入口函数中创建或结束线程时卡死

先看一下使用Delphi开发DLL时如何使用MAIN函数, 通常情况下并不会使用到DLL的MAIN函数,因为delphi的框架已经把Main函数隐藏起来 而工程函数的 begin end 默认就是MAIN...到内存中的过程中,LdrpLoaderLock是处于锁定状态的。...另外有一个特殊的现象,就是DLL_PROCESS_DETACH事件中,线程处于挂起状态,这是因为系统分配线程执行时间片的过程中由于PE Loader有资源处于锁定而导致线程无法进行下一个时间片,最终表现为线程函数处于假死状态...,此状态基本上等同于线程的挂起(suspend)状态。...解决办法同样是避免在 DLL_PROCESS_DETACH事件中结束线程,那么我们可以在该事件中,创建并唤醒另外一个线程,在该新的线程里,结束需要结束的线程,并在完成后结束自身即可。

3.8K10
  • 初探Windows用户态调试机制

    //注意:在Delphi调试器里会卡在这个地方,非调试环境下没有问题。...在调试器开始调试的时候,会启动被调试程序的新进程或者挂接(attach)到一个已运行进程上,此时Win32系统会启动调试接口的服务器端;然后调试器调用WaitForDebugEvent函数等待调试服务器端的调试事件被引发...BOOLEAN SuspendProcess) 其中ApiMsg用来描述消息的,Port用来指定要发送的端口,大多数时候就是EPROCESS结构的DebugPort字段的值,偶尔是进程中的异常端口,即...在处理调试事件的过程中,被调试进程时处于挂起状态的。处理调试事件后,调试器调用ContinueDebugEvent将处理结果回复给调试子系统。...在内核中调试事件使用DBGKM_APIMSG的结构来描述。在发送调试器时,调试API使用的是DEBUG_EVENT结构。所以之间必定有一个转换过程。

    75420

    DllMain中不当操作导致死锁问题的分析--进程对DllMain函数的调用规律的研究和分析

    Dll加载后,DllMain被调用是否受之前创建的线程影响。...如果受到影响,我们应该能看到Dll1中输出的信息中包含有线程A TID的记录。反之则没有记录。          2 这个过程是为了验证创建新线程,对之前加载的Dll的DllMain调用情况。...我们将过程6替换为过程61,并在子线程中执行,结果大部分相似,我把不一样的地方列出来(执行线程TID是4752) 61 Dll1 TID:4752 DLL_PROCESS_DETACH 执行线程(4752...幸运的是,在大多数程序中,调用Loadlibrary的线程与调用Freelibrary的线程是同一个线程。...102例子中我们看到主线程退出后,子线程还在正常工作的场景,可以想象,可能是ExitProcess是直接TerminateThread主线程了。

    1.2K20

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

    Delphi写的程序,如果在单元的finalization里出现了一些异常操作会导致退出时抛出Runtime Error ,规范的处理办法当然是解决这些异常,但是有些特殊的情况下,比如用了很多的第三方控件...做法其实很简单,就是在 END.之前手工调用Halt释放,并且将Halt抛出的错误屏蔽掉,这样做和正常的DELPHI释放过程没有任何区别,因为End.编译后其实就是一句话 Call Halt0,只是VCL...中处理,函数检查错误类型是否是DelphiException,如果不是就不处理,这个时候就会被DELPHI的顶层异常机制捕获,并抛出Runtime error,halt里抛出来的错误恰恰就是非DelphiException...Halt0退出 call Halt0;   @@exit:  end; 这个做法的好处就是,不会对DELPHI正常释放过程产生影响,所有的释放操作都是和VCL一致的,只是不会把错误显示出来。...测试这段代码可以,自己在某个单元的finalization段里抛出一个异常,看看加上代码和不加代码的效果有何不同。

    93040

    快速入门系列--CLR--02多线程

    这个过程存在不小的风险,因此也对发布后的生产服务器进行了密切的监控,结果还是出现了个别应用出现异常的情况,很快的占用了大量的服务器内存和CPU等资源。...通过研究dump,初步发现是由于配置服务器出现单点故障,然后应用通过多线程调用相关SOA服务时出现异常,引发了ThreadAbortException异常,而且由于原有异常处理代码不够严谨,而且与异步发送报警邮件紧密结合在一起...内核模式栈,当调用内核API时会使用 DLL线程连接和分离通知,windows每创建一个线程就会加载所有DLL中的入口方法,并传递一个dll_thread_attach的方法,当加载dll很多是,这个操作会造成很大的性能消耗...若想在线程终止前恢复线程的执行,可以在捕获异常后 ,在catch(ThreadAbortException ex){...} 中调用Thread.ResetAbort()取消终止。...ThreadAbortException是一种可捕获的特殊异常,但在catch块的结尾处它将自动被再次引发。引发此异常时,运行时将在结束线程前执行所有finally块。

    91790

    用了下FIREBIRD,发现真的不错哦

    的形式,使用存储过程,以得到一个虚拟的表结构的结果。...这样的话,你就可以很容易的在报表中使用它。 事件: 存储过程和触发器可以引发事件,这个事件可以被客户端程序监听到 生成子: 生成子也称为序列,它可以很容易的实现自动增加的字段。...因此,用户可以在备份期间持续的工作,即实现24×7(每天24小时,每周7天)的操作。 触发器: 每一个表可以有多个并发的行级触发器,可以在插入前,插入后,更新前,更新后,删除前,删除后进行触发。...我们可以在触发器中写入PSQL语句,默认值,产生异常,firebird现在支持统一触发器,即可以一个触发器中,一次性管理插入,更新,删除的操作。...扩展函数: 我们可以使用C语言,C++,DELPHI写UDF,使用UDF(用户定义函数库)可以很容易的挂入数据库引擎中以扩展我们需要的功能 字符集:Firebird实现了很多国际标准的字符集,包括Unicode

    1.4K30

    网络游戏开发基础篇

    大家好,又见面了,我是你们的朋友全栈君。 本篇的内容,会介绍几个内容:单例,dll动态加载以及一些跨平台的处理。...1、单例:单例模式是一种使用广泛而又比较简单的设计模式,他的定义我就不多介绍了,大家上网一查就知道了,基本都能理解。在游戏开发中,会有很多单件,所以封装一个单例类供后面的开发使用。....};      2、dll(so)动态加载 在开发网络游戏的过程中,现在已经不是能够单打独斗的年代了,一款游戏基本上不可能有一个人完成,因此分模块开发成为了必然,各自开发相关的模块...,在linux的开发中,我们需要做一些包装,使其在开发过程中和window代码一致。...如果在开发中遇到了其他的情况,也可以加到此文件中,以方便应用开发。

    1.2K40

    自由控制程序运行方式的编程技巧

    因此,在我们的调试器显示消息的过程中,调试对象是处于暂停状态的 //调用 ContinueDebugEvent 函数可以让调试对象恢复运行,这时调试器又回到 WatiForDebugEvent...(调试对象)中所产生的异常都会被调试器捕捉到 通过 CREATE_SUSPENDED 标志可以让进程在启动后进入挂起状态。...、线程以及加载、卸载 DLL 等事件 2、实现反汇编功能 本小节添加反汇编功能,希望能实现一下功能: 显示出发生异常的地址以及当前寄存器的值 显示发生异常时所执行的指令 // wdbg02a.cpp...2 个异常 对应源代码中的 *s = 0xFF 二、代码注入 本节介绍了3种代码注入的手法 1、用 SetWindowsHookEx 劫持系统消息 先简单看下三个 Windows 官方 API 函数:...DLL 的日志 2、将 DLL 路径配置到注册表的 AppInit_DLLs 项 如果我们将 DLL 的路径配置在注册表的 AppInit_DLLs 项(位置见下图)中,就可以在系统启动时将任意 DLL

    67310

    软件安全之动态链接库的使用 Libzplay 播放音乐「建议收藏」

    实验 1 动态链接库的使用 实验说明 Libzplay 是遵循 GPL 协议的开源库,它集成了 mp3、flac、ac3、aac、wav等多种音频格式的解码器和编码器,提供了面向 C/C++、C#、Delphi...将 libzplay 库中的 DLL 文件 libzplay.dll 拷贝到编译生成的可执行文件所在目录,或者将该 DLL 文件放入 DLL 加载过程要搜索的目录。...libzplay.dll FreeLibrary(hModule); 完整程序 #include #include #include #...将 libzplay 库中的 DLL 文件 libzplay.dll 拷贝到编译生成的可执行文件所在目录,或者将该 DLL 文件放入 DLL 加载过程要搜索的目录。...显示链接不需要用到lib库,全部独立自主进行dll调用,在执行过程中随时可以加载或卸载DLL文件,这是依赖于lib的隐式链接做不到的,因此显式链接具有更好的灵活性,同时也能更有效的使用内存,这在编写大型项目程序时大有作为

    1.2K20

    C++基础 静态库与动态库

    静态链接库(*.lib) 如果在程序中使用静态链接库,那么链接器在链接的过程中会将.obj文件和.lib文件组织成可执行exe文件,也就是将.lib中的代码链接到可执行文件中,因此生成的exe文件比较大...注意该.lib与静态链接库的.lib文件不同,静态链接库的.lib中包含了所需函数的代码,动态链接库的.lib仅指示函数在dll文件中的入口。...隐式加载也会有静态链接库的问题,如果程序稍大,加载时间就会过长。 显式加载 显式加载,也称运行时加载,是在程序运行过程中加载,不需要该dll时则将其释放。...使用动态链接库的程序在发行时需要提供dll文件。在编译时,如果使用隐式链接则需要提供.lib文件,生成可执行文件后则不再需要该.lib。如果使用显式链接,在编译时不需提供.lib文件。...不同编程语言编写的程序只要按照函数调用约定就可以调用同一个dll函数 适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试 动态库缺点总结 使用动态链接库的应用程序不是自完备的

    1.4K10

    c++DLL编程详解

    譬如Windows提供的系统 DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。   ...可以在.def文件中的导出函数名后加@n,表示要导出函数的序号          为n(在进行函数调用时,这个序号将发挥其作用);   (3).def 文件中的注释由每个注释行开始处的分号 (;) 指定...当应用程序运行过程中需要加载DLL文件时,Windows将根据这些信息发现并加载DLL,然后通过符号名实现对DLL 函数的动态链接。...= NULL) { int result = addFun(2, 3); printf("\ncall add in dll:%d", result); } FreeLibrary(hDll); } 代码中的...若要导出某全局变量,我们需要在.def文件的EXPORTS后添加: 变量名 CONSTANT   //过时的方法 变量名 DATA        //VC++提示的新方法 在主函数中引用DLL中定义的全局变量

    2.3K60

    PE文件和COFF文件格式分析——导出表的应用——一种插件模型

    现在思考一个过程,我们的Exe程序的逻辑可能需要若干Dll中函数来辅助。如下图 ?         A.exe需要B.dll、C.dll和D.dll辅助。...),该DLL就导出B.dll中B1()、C.dll中C1()和D.dll中D1()的入口地址。...我们这么设计要多维护一个DLL(PluginHelper.dll),这个也就引入了一个不稳定因素。那么这个DLL可以省掉么?省掉后导出的那些函数放哪儿?        ...我们让A.exe导出函数,反正我们A.exe也是要加载B.dll、C.dll和D.dll,这样还可以省下PluginHelper.dll加载如上DLL的过程。现在我写了一个工程,模拟这种插件模型。...至于插件的调用,我这儿不准备搞复杂的设计,我这儿将直接Load插件DLL,并调用DLL中的导出方法(该方法的调用约定是提前确定好的)。

    62950

    C++基础语法梳理:Windows 的动态链接库

    C++ 类(导出导入需要同编译器,否则避免导出) (5)DLL 模块:cpp 文件中的 __declspec(dllexport) 写在 include 头文件之前 (6)调用 DLL 的可执行模块:cpp...如: DUMPBIN -exports D:\mydll.dll 复制代码 LoadLibrary 与 FreeLibrary 流程图 LoadLibrary 与 FreeLibrary 流程图 LoadLibrary...FreeLibrary DLL 库的编写(导出一个 DLL 模块) DLL 库的编写(导出一个 DLL 模块) DLL 头文件 // MyLib.h #ifdef MYLIBAPI // MYLIBAPI...(往往是运行库中的某个入口函数) (2)入口函数对运行库和程序运行环境进行初始化(包括堆、I/O、线程、全局变量构造等等)。...(3)入口函数初始化后,调用 main 函数,正式开始执行程序主体部分。

    1.2K00

    从零开始编写网络游戏--基础篇(1)

    1、单例:单例模式是一种使用广泛而又比较简单的设计模式,他的定义我就不多介绍了,大家上网一查就知道了,基本都能理解。在游戏开发中,会有很多单件,所以封装一个单例类供后面的开发使用。        ...class Test : public Singleton{...};  2、dll(so)动态加载         在开发网络游戏的过程中,现在已经不是能够单打独斗的年代了,一款游戏基本上不可能有一个人完成...本例中使用了LoadLibrary,是windows的实现方法,在后面平台相关处理中,我会将linux的函数封装一下,和windows同名。...,在linux的开发中,我们需要做一些包装,使其在开发过程中和window代码一致。...如果在开发中遇到了其他的情况,也可以加到此文件中,以方便应用开发。        大家可能会觉得在这里看代码比较别扭,我把代码上传到了空间,大家可以去下载。 从零开始编写网络游戏--基础篇 源码

    71610

    远程线程注入Dll,突破Session 0

    VS2019 什么是session 0 在Windows XP,Windows Server 2003以及更早的版本中,第一个登录的用户以及Windows的所有服务都运行在Session 0上。...这样做危险的地方是,用户使用的应用程序可能会利用Windows的服务程序提升自己的权限。 后续版本的windows,普通应用程序已经不再session 0中运行 ?...和传统的 CreateRemoteThread 函数实现的远线程注入 DLL 的唯一一个区别就是,我们调用的是更为底层的ZwCreateThreadEx来创建线程, 虽然CreateRemoteThread...)的值始终为1,它会导致线程创建完成后一直挂起无法恢复运行,于是我们选择直接调用ZwCreateThreadEx,将第7个参数直接置为0,这样可达到注入目的 实现过程 先创建一个dll BOOL APIENTRY...中并没有声明,所以我们需要使用 GetProcAddress 从 ntdll.dll 中获取该函数的导出地址。

    1.1K30

    进程注入1:通过LoadLibrary注入DLL

    进程可以使用该句柄在对GetProcAddress,FreeLibrary或FreeLibraryAndExitThread函数的调用中识别DLL 该的GetModuleHandle函数返回使用的手柄GetProcAddress...该过程可以使用GetProcAddress通过LoadLibrary或LoadLibraryEx,GetModuleHandle返回的DLL模块句柄获取DLL中导出函数的地址。...当不再需要DLL模块时,该过程可以调用FreeLibrary或FreeLibraryAndExitThread。...如果引用计数为零,这些函数将减少模块引用计数,并从进程的虚拟地址空间取消DLL代码的映射。 即使DLL不可用,运行时动态链接也可使进程继续运行。然后,该过程可以使用替代方法来实现其目标。...为项目选择名称和文件路径后,将显示以下代码: // dllmain.cpp : 定义 DLL 应用程序的入口点。

    2.5K30
    领券