首页
学习
活动
专区
工具
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在寻找路径问题上存在一定策略。...远线程是在被注入进程执行,那么远线程LoadDLL文件文件句柄应该在被注入进程地址空间中,我们在注入进程获得它也不能操作啊?...我想很多做这块的人都发现过,在xp挂起方式创建进程,在被执行完远线程并线程退出,恢复主线程会导致主进程退出。

85120

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

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

3.7K10

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

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

1.1K20

初探Windows用户态调试机制

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

73920

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段里抛出一个异常,看看加上代码和不加代码效果有何不同。

86940

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

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

86890

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

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

1.3K30

网络游戏开发基础篇

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

1.2K40

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

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

1.3K10

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

因此,在我们调试器显示消息过程,调试对象是处于暂停状态 //调用 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

62110

软件安全之动态链接库使用 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.1K20

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

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

60450

c++DLL编程详解

譬如Windows提供系统 DLL(其中包括了WindowsAPI),在任何开发环境中都能被调用,不在乎其是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.2K60

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.1K00

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

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

69310

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

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

2.2K30

远程线程注入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

技术分享 | DLL注入之远线程注入

lpParameter: 指向要传递给线程函数变量指针。 dwCreationFlags: 控制线程创建标志。若为0,表示线程在创建立即运行。...返回值: 成功:返回新线程句柄 失败:返回NULL 0x02 实现过程 1、获取LoadLibrary函数地址,对于kernel32.dll加载基址在每个进程中都是相同,所以我们能获取LoadLibrary....dll";     CreateRemoteThreadInjectDll(9956, dllPath);     return 0; } DLL代码: 该DLL项目由vs2019生成,注入自动弹出消息框...在内核6.0(Windows VISTA、7、8)之后,由于session隔离机制,在创建进程之后是先挂起进程,检查进程所在会话层再决定是否恢复进程。...在CreateRemoteThread函数调用ZwCreateThreadEx函数时,由于ZwCreateThreadEx第七个参数为1,会导致线程创建一直处于挂起状态,因此我们需要设置ZwCreateThreadEx

81840
领券