动态链接库

时间:2024-04-08 21:14:06编辑:奇事君

错动态链接库(DLL)初始化例程失败。

DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:\Windows\System目录下。

1、如何了解某应用程序使用哪些DLL文件
右键单击该应用程序并选择快捷菜单中的“快速查看”命令,在随后出现的“快速查看”窗口的“引入表”一栏中你将看到其使用DLL文件的情况。

2、如何知道DLL文件被几个程序使用
运行Regedit,进入HKEY_LOCAL_MACHINE\Software\Microsrft\Windows\Current-Version\SharedDlls子键查看,其右边窗口中就显示了所有DLL文件及其相关数据,其中数据右边小括号内的数字就说明了被几个程序使用,(2)表示被两个程序使用,(0)则表示无程序使用,可以将其删除。

3、如何解决DLL文件丢失的情况
有时在卸载文件时会提醒你删除某个DLL文件可能会影响其他应用程序的运行。所以当你卸载软件时,就有可能误删共享的DLL文件。一旦出现了丢失DLL文件的情况,如果你能确定其名称,可以在Sysbckup(系统备份文件夹)中找到该DLL文件,将其复制到System文件夹中。如果这样不行,在电脑启动时又总是出现“***dll文件丢失……”的提示框,你可以在“开始/运行”中运行Msconfig,进入系统配置实用程序对话框以后,单击选择“System.ini”标签,找出提示丢失的DLL文件,使其不被选中,这样开机时就不会出现错误提示了。


动态链接库dll初始化例程失败

DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:\Windows\System目录下。
1、如何了解某应用程序使用哪些DLL文件
右键单击该应用程序并选择快捷菜单中的“快速查看”命令,在随后出现的“快速查看”窗口的“引入表”一栏中你将看到其使用DLL文件的情况。
2、如何知道DLL文件被几个程序使用
运行Regedit,进入HKEY_LOCAL_MACHINE\Software\Microsrft\Windows\Current-Version\SharedDlls子键查看,其右边窗口中就显示了所有DLL文件及其相关数据,其中数据右边小括号内的数字就说明了被几个程序使用,(2)表示被两个程序使用,(0)则表示无程序使用,可以将其删除。
3、如何解决DLL文件丢失的情况
有时在卸载文件时会提醒你删除某个DLL文件可能会影响其他应用程序的运行。所以当你卸载软件时,就有可能误删共享的DLL文件。一旦出现了丢失DLL文件的情况,如果你能确定其名称,可以在Sysbckup(系统备份文件夹)中找到该DLL文件,将其复制到System文件夹中。如果这样不行,在电脑启动时又总是出现“***dll文件丢失……”的提示框,你可以在“开始/运行”中运行Msconfig,进入系统配置实用程序对话框以后,单击选择“System.ini”标签,找出提示丢失的DLL文件,使其不被选中,这样开机时就不会出现错误提示了。
我也不知道 但是我觉得这个问题值得研究 就给你在网上找了你看看吧!


DELPHI基础教程:动态链接库编程(一)[2]

   DLLs中的变量和段   一个DLLs拥有自己的数据段(DS) 因而它声明的任何变量都为自己所私有 调用它的模块不能直接使用它定义的变量 要使用必须通过过程或函数界面才能完成 而对DLLs来说 它永远都没有机会使用调用它的模块中声明的变量   一个DLLs没有自己的堆栈段(SS) 它使用调用它的应用程序的堆栈 因此在DLL中的过程 函数绝对不要假定DS = SS 一些语言在小模式编译下有这种假设 但使用Delphi可以避免这种情况 Delphi绝不会产生假定DS = SS的代码 Delphi的任何运行时间库过程/函数也都不作这种假定 需注意的是如果读者想嵌入汇编语言代码 绝不要使SS和DS登录同一个值    DLLs中的运行时间错和处理   由于DLLs无法控制应用程序的运行 导致很难进行异常处理 因此编写DLLs时要十分小心 以确保被调用时能正常执行 当DLLs中发生一个运行时间错时 相应DLLs并不一定从内存中移去(因为此时其它应用程序可能正在用它) 而调用DLLs的程序异常中止 这样造成的问题是当DLLs已被修改 重新进行调用时 内存中保留的仍然可能是以前的版本 修改后的程序并没有得到验证 对于这个问题 有以下两种解决方法    在程序的异常处理部分显式将DLL卸出内存    完全退出Windows 而后重新启动 运行相应的程序   同一般的应用程序相比 DLL中运行时间错的处理是很困难的 而造成的后果也更为严重 因此要求程序设计者在编写代码时要有充分 周到的考虑    库初始化代码的编写   传统Windows中动态链接库的编写 需要两个标准函数 LibMain和WEP 用于启动和关闭DLL 在LibMain中 可以执行开锁DLL数据段 分配内存 初始化变量等初始化工作 而WEP在从内存中移去DLLs前被调用 一般用于进行必要的清理工作 如释放内存等 Delphi用自己特有的方式实现了这两个标准函数的功能 这就是在工程文件中的begin…end部分添加初始化代码 和传统Windows编程方法相比 它的主要特色是    初始化代码是可选的 一些必要的工作(如开锁数据段)可以由系统自动完成 所以大部分情况下用户不会涉及到    可以设置多个退出过程 退出时按顺序依次被调用    LibMain和WEP对用户透明 由系统自动调用   初始化代码完成的主要工作是    初始化变量 分配全局内存块 登录窗口对象等初始化工作 在( )节 利用DLLs实现应用程序间的数据传输 中 用于数据共享的全局内存块就是在初始化代码中分配的    设置DLLs退出时的执行过程 Delphi有一个预定义变量ExitProc用于指向退出过程的地址 用户可以把自己的过程名赋给ExitProc 系统自动调用WEP函数 把ExitProc指向的地址依次赋给WEP执行 直到ExitProc为nil   下边的一段程序包含一个退出过程和一段初始化代码 用来说明如何正确设置退出过程   library Test;   {$S }   uses WinTypes WinProcs;   var   SaveExit: Pointer;   procedure LibExit; far;   begin   if ExitCode = wep_System_Exit then   begin   { 系统关闭时的相应处理 }   end   else   begin   { DLL卸出时的相应处理 }   end;   ExitProc := SaveExit; { 恢复原来的退出过程指针 }   end;   begin   {DLL的初始化工作 }   SaveExit := ExitProc; { 保存原来的退出过程指针 }   ExitProc := @LibExit; { 安装新的退出过程 }   end   在初始化代码中 首先把原来的退出过程指针保存到一个变量中 而后再把新的退出过程地址赋给ExitProc 而在自定义退出过程LibExit结束时再把ExitProc的值恢复 由于ExitProc是一个系统全局变量 所以在结束时恢复原来的退出过程是必要的   退出过程LibExit中使用了一个系统定义变量ExitCode 用于标志退出时的状态 ExitCode的取值与意义如下   表 ExitCode的取值与意义   ━━━━━━━━━━━━━━━━━━━━━   取 值 意 义      WEP_System_Exit Windows关闭   WEP_Free_DLLx DLLs被卸出   ━━━━━━━━━━━━━━━━━━━━━   退出过程编译时必须关闭stack_checking 因而需设置编译指示 {$S }    编写一般DLLs的应用举例   在下面的程序中我们把一个字符串操作的函数储存到一个DLLs中 以便需要的时候调用它 应该注意的一点是 为了保证这个函数可以被其它语言编写的程序所调用 作为参数传递的字符串应该是无结束符的字符数组类型(即PChar类型) 而不是Object Pascal的带结束符的Srting类型 程序清单如下   library Example;   uses   SysUtils   Classes;   {返回字符在字符串中的位置}   function InStr(SourceStr: PChar;Ch: Char) Integer; export;   var   Len i: Integer;   begin   Len := strlen(SourceStr)   for i := to Len do   if SourceStr[i] = ch then   begin   Result := i;   Exit;   end;   Result := ;   end;   exports   Instr Index name MyInStr resident;   begin   end    调用DLLs   有两种方法可用于调用一个储存在DLLs中的过程 lishixinzhi/Article/program/Delphi/201311/25208


DELPHI基础教程:动态链接库编程(一)[4]

  Order := TInstr(PFunc)(text Key)   TInStr是一个定义好了的函数类型   type   TInStr = function(Source: PChar;Check: Char) Integer;    利用DLLs实现数据传输    DLLs中的全局内存   Windows规定 DLLs并不拥有它打开的任何文件或它分配的任何全局内存块 这些对象由直接或间接调用DLLs的应用程序拥有 这样 当应用程序中止时 它拥有的打开的文件自动关闭 它拥有的全局内存块自动释放 这就意味着保存在DLLs全局变量中的文件和全局内存块变量在DLLs没有被通知的情况下就变为非法 这将给其它使用该DLLs的应用程序造成困难   为了避免出现这种情况 文件和全局内存块句柄不应作为DLLs的全局变量 而是作为DLLs中过程或函数的参数传递给DLLs使用 调用DLLs的应用程序应该负责对它们的维护   但在特定情况下 DLLs也可以拥有自己的全局内存块 这些内存块必须用gmem_DDEShare属性进行分配 这样的内存块直到被DLLs显示释放或DLLs退出时都保持有效   由DLLs管理的全局内存块是应用程序间进行数据传输的又一途径 下面我们将专门讨论这一问题    利用DLLs实现应用程序间的数据传输   利用DLLs实现应用程序间的数据传输的步骤为    编写一个DLLs程序 其中拥有一个用gmem_DDEShare属性分配的全局内存块    服务器程序调用DLLs 向全局内存块写入数据    客户程序调用DLLs 从全局内存块读取数据    用于实现数据传输的DLLs的编写   用于实现数据传输的DLLs与一般DLLs的编写基本相同 其中特别的地方是    定义一个全局变量句柄   var   hMem: THandle;    定义一个过程 返回该全局变量的句柄 该过程要包含在exports子句中 如   function GetGlobalMem: THandle; export;   begin   Result := hMem;   end;    在初始化代码中分配全局内存块   程序清单如下   begin   hMem := GlobalAlloc(gmem_MOVEABLE and gmem_DDEShare num)   if hMem = then   MessageDlg( Could not allocate memory mtWarning [mbOK] )   end   num是一个预定义的常数   Windows API函数GlobalAlloc用于从全局内存堆中分配一块内存 并返回该内存块的句柄 该函数包括两个参数 第一个参数用于设置内存块的分配标志 可以使用的分配标志如下表所示   表 全局内存块的分配标志   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   标 志 意 义      gmem_DDEShare 分配可由应用程序共享的内存   gmem_Discardable 分配可抛弃的内存(只与gmem_Moveable连用)   gmem_Fixed 分配固定内存   gmem_Moveable 分配可移动的内存   gmem_Nopact 该全局堆中的内存不能被压缩或抛弃   gmem_Nodiscard 该全局堆中的内存不能被抛弃   gmem_NOT_Banked 分配不能被分段的内存   gmem_Notify 通知功能 当该内存被抛弃时调用GlobalNotify函数   gmem_Zeroinit 将所分配内存块的内容初始化为零   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   有两个预定义的常用组合是   GHND = gmem_Moveable and gmem_Zeroinit   GPTK = gmem_Fixed and gmem_Zeroinit   第二个参数用于设置欲分配的字节数 分配的字节数必须是 的倍数 因而实际分配的字节数可能比所设置的要大   由于用gmem_DDEShare分配的内存在分配内存的模块终止时自动抛弃 因而不必调用GlobalFree显式释放内存    返回目录 DELPHI基础教程 编辑推荐 Java程序设计培训视频教程 J EE高级框架实战培训视频教程   Visual C++音频/视频技术开发与实战   Oracle索引技术   ORACLE G数据库开发优化指南   Java程序性能优化 让你的Java程序更快 更稳定   C嵌入式编程设计模式   Android游戏开发实践指南 lishixinzhi/Article/program/Delphi/201311/25210


上一篇:知网免费入口

下一篇:文件下载