DLL笔记

avutil-56.dll文件丢失?深度解析印象笔记avutil-56.dll文件丢失原因及修复方法 文件是印象笔记(Evernote)或某些相关软件依赖的动态链接库文件,它包含了许多程序运行所需的函数和资源。:在进行系统更新或软件升级时,有时新版本的软件会更改或替换旧的DLL文件,如果升级过程发生异常,可能会导致。:在安装印象笔记或其他相关软件时,如果安装过程被中断或安装包本身存在问题,可能会导致。:虽然较为罕见,但硬盘的物理损伤或逻辑问题也可能导致DLL文件的丢失或损坏。:用户在清理系统或进行其他操作时,可能会不小心删除重要的DLL文件,包括。:某些恶意软件可能会删除或破坏系统中的DLL文件,包括。 阅读详情

DLL笔记

 

下面以DLL简单程序的测试,来展示DLL的用法和各种注意点:

 

一个DLL程序:

 

library Project2;

 

uses

 

  SysUtils,Classes;

 

{$R *.res}

 

function Min(X, Y: Integer): Integer; stdcall;

 

begin

 

  if X < Y then Min := X else Min := Y;

 

end;

 

function Max(X, Y: Integer): Integer; stdcall;

 

begin

 

  if X > Y then Max := X else Max := Y;

 

end;

 

exports

 

  Min,

 

  Max;

 

begin

 

end.

 

l         一个调用程序:

 

unit DLLTest;

 

 

interface

 

 

uses

 

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 

  Dialogs, StdCtrls;

 

const

 

  DLL='project2.DLL';

 

type

 

  TForm1 = class(TForm)

 

    Button1: TButton;

 

    Edit1: TEdit;

 

    procedure Button1Click(Sender: TObject);

 

  private

 

    { Private declarations }

 

  public

 

    { Public declarations }

 

  end;

 

 

var

 

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

function Min(X, Y: Integer): Integer; stdcall; external DLL;

 

function Max(X,Y:Integer):Integer; stdcall; external DLL;

 

 

procedure TForm1.Button1Click(Sender: TObject);

 

begin

 

  Edit1.Text:=IntToStr(Min(3,5));

 

end;

 

 

end.

 

输出结果当然是3

 

l         另一个调用程序:

 

unit DLLTest;

 

 

interface

 

 

uses

 

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 

  Dialogs, StdCtrls;

 

const

 

  DLL='project2.DLL';

 

 

type

 

  TForm1 = class(TForm)

 

    Button1: TButton;

 

    Edit1: TEdit;

 

    procedure Button1Click(Sender: TObject);

 

  private

 

    { Private declarations }

 

  public

 

    { Public declarations }

 

  end;

 

function Min(X, Y: Integer): Integer; stdcall; external DLL;

 

function Max(X, Y: Integer): Integer; stdcall; external DLL;

 

 

var

 

  Form1: TForm1;

 

 

implementation

 

 

{$R *.dfm}

 

 

procedure TForm1.Button1Click(Sender: TObject);

 

begin

 

  Edit1.Text:=IntToStr(Min(3,5));

 

end;

 

 

end.

 

输出结果也是3

 

结论:无论在Interface还是implementation部分声明,都可以,但区别当然也是很明显的,声明在Interface的可以被其他单元调用,而声明在implementation的,只能在自己的单元中被调用。要可以被其他单元调用,还有别一种形式,代码如下:

 

unit DLLTest;

 

 

interface

 

 

uses

 

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 

  Dialogs, StdCtrls;

 

const

 

  DLL='project2.DLL';

 

 

type

 

  TForm1 = class(TForm)

 

    Button1: TButton;

 

    Edit1: TEdit;

 

    procedure Button1Click(Sender: TObject);

 

  private

 

    { Private declarations }

 

  public

 

    { Public declarations }

 

  end;

 

function Min(X, Y: Integer): Integer; stdcall;

 

function Max(X, Y: Integer): Integer; stdcall;

 

 

var

 

  Form1: TForm1;

 

 

implementation

 

 

{$R *.dfm}

 

 

function Min; external DLL;

 

function Max; external DLL;

 

 

procedure TForm1.Button1Click(Sender: TObject);

 

begin

 

  Edit1.Text:=IntToStr(Min(3,5));

 

end;

 

 

end.

 

l         将其中一个函数的大小写变一下:

 

function min(X, Y: Integer): Integer; stdcall; external DLL;

 

程序出现错误,说明对于DLL的函数声明是大小写敏感的。

 

l         现在将DLL文件的Exports块修改如下:

 

exports

 

  Min name ‘Max’,

 

  Max name ‘Min’;

 

再将上面调用程序运行一遍,输出结果是5,说明,如上声明之后,在DLL程序中的Min函数,它输出为Max了,而Max则输输出为Min了。

 

l         再将Exports块改为如下形式:

 

exports

 

  Min name index 1,

 

  Max name index 2;

 

再将调用程序的的声明变为如下:

 

function Min; external DLL index 2;

 

//function Max; external DLL;

 

运行结果为5,则说明当DLL程序声明Index后,外部程序调用时如果也用Index,则调用DLL哪个函数由Index来决定。如果DLL没有在函数输出后面加Index,则外部程序加上Index无效。

 

l         将调用程序的函数声明变为如下:

 

function Min; external DLL name 'Max';

 

function Max; external DLL name 'Min';

 

则程序运行结果是5,说明如果用了name,则外部函数实际对应的是DLL中和Name后面的字符串相同的函数,大小敏感。

 

 

 

{三}C基本类型与Delphi类型的对应

 

//整型

 

INT64 = Int64       有符号64位整数

 

INT = Integer       有符号32位整数

 

LONG = Longint      有符号32位整数

 

WPARAM = Longint   有符号32位整数

 

LPARAM = Longint   有符号32位整数

 

LRESULT = Longint  有符号32位整数

 

HANDLE = Loingint  有符号32位整数

 

UINT = LongWord    无符号32位整数

 

DWORD = DWORD       无符号32位整数

 

SHORT = Smallint   有符号16位整数

 

WORD = Word         无符号16位整数

 

BYTE = Byte         无符号8位整数

 

 

//浮点型

 

FLOAT = Single     4个字节

 

DOUBLE = Double    8个字节

 

 

//字符型

 

CHAR = Char

 

WCHAR = WideChar;

 

PWChar = PWideChar;

 

LPSTR = PAnsiChar;

 

LPCSTR = PAnsiChar;

 

LPCTSTR = PAnsiChar;

 

LPTSTR = PAnsiChar;

 

LPWSTR = PWideChar;

 

LPCWSTR = PWideChar;

 

 

//布尔型

 

BOOL = LongBool;   4个字节

 

bool = Boolean;    1个字节

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DLL用法》的笔记 DLL用法 2016-01-21 DLL用法的介绍 1、 DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。这些可以直接拿来使用。 静态链接库与动态链接库的区别: (1)静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的指令都包含在最终生成的EXE文件中了;动态链接库不必被包含在最终EXE文件中,EXE 阅读详情

相关推荐

关于对加壳后DLL的调试分析的笔记

这个是很久之前分析一个DLL时的文章了。写在了QQ空间里面。现在翻出来,慰问下自己。其实不算是高明的东西。之前在分析一个样本时,该样本释放出了一个DLL,由于脱壳的功力不够强悍,但是便于分析。就自己写了个程序来调用。OnlyDBG虽然可以LoadDll插件来加载,但是个人感觉复杂(也许是没有用好的关系),我更喜欢此种方式,代码简陋,不要耻笑:)有如下代码片段#include #include _declspec (dllexport)  void  FuncationName(ParamType Param

qinghai0011的专栏 2038

【自学笔记】什么是dll文件,如何下载dll文件,修复dll文件丢失

什么是dll文件,如何下载dll文件,修复dll文件丢失

XiaoqiangClub的博客 902

HOOK API——Windows核心编程 第22章 插入DLL和挂接API学习笔记

介绍:HOOK API是指截获特定进程或系统对某个API函数的调用,使得API的执行流程转向指定的代码。Windows下的应用程序都建立在API函数至上,所以截获API是一项相当有用的技术,它使得用户有机会干预其它应用程序的程序流程。最常用的一种挂钩API的方法是改变目标进程中调用API函数的代码,使得它们对API的调用变为对用户自定义函数的调用。HOOK API和HOOK技术完全不同。尽

super_chris的专栏 9518

python pandas 之drop()函数

drop函数的使用 (1)drop() 删除行和列 drop([ ],axis=0,inplace=True) drop([]),默认情况下删除某一行; 如果要删除某列,需要axis=1; 参数inplace 默认情况下为False,表示保持原来的数据不变,True 则表示在原来的数据上改变。 ...

重剑无锋博客 4189

笔记本NVCPL.DLL出错?深度解析:笔记本NVCPL.DLL错误原因及高效解决策略!

NVCPL.DLL是NVIDIA显卡驱动程序中的一个重要文件,主要负责显卡参数的调节和控制面板的功能。

2401_87099071的博客 1164

如何应对印象笔记(Evernote)缺失DLL文件的问题:全面解决指南

在使用印象笔记(Evernote)时,偶尔可能会遇到因缺失DLL文件而导致的程序无法启动或功能异常的情况。DLL(动态链接库)文件是Windows系统中重要的组件,许多应用程序依赖它们来执行特定功能。当这些文件丢失或损坏时,应用程序可能无法正常工作。本文将详细介绍如何诊断和解决印象笔记DLL文件缺失的问题。

Xixix777的博客 454

修复印象笔记提示缺少encrashrep.dll文件的全面指南

encrashrep.dll是印象笔记软件的一部分,与程序的错误报告和崩溃处理机制相关。当系统提示缺少此文件时,意味着印象笔记在尝试调用相关功能时找不到必要的组件,从而导致启动或运行错误。

Xixix777的博客 877

解决《盗墓笔记:启程》DLL文件缺失:简易修复步骤

请注意,只从信誉良好的网站下载DLL文件,以避免潜在的安全风险。更新操作系统:确保您的操作系统是最新的,有时候缺少DLL文件的问题可能是由于操作系统补丁未安装造成的。验证游戏完整性:如果是在Steam或其他平台上运行的游戏,可以尝试验证游戏文件的完整性。关闭安全软件:暂时关闭您的防病毒软件或防火墙,以防它们阻止游戏的安装。复制DLL文件:将下载的DLL文件复制到游戏安装目录下的相应文件夹中。重新安装:从官方渠道下载最新版本的游戏安装包,并重新安装游戏。卸载游戏:首先,彻底卸载游戏,确保没有任何残留文件。

leleshengh520的博客 450

关于DLL的一点笔记

DLL的一点笔记

Han的小站 501

C 调用C++的Dll dll DLL 类型之间转换笔记

C 调用C++的Dll dll DLL 类型之间转换笔记

ffghggf的博客 971

我的Dll(动态链接库)学习笔记 rivershan(原作)

我的Dll(动态链接库)学习笔记    rivershan(原作) DLL(Dynamic Link Libraries)专题:     比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:

加肥冒 1241

C# dll笔记

dll,动态链接库。C++和C#都能打包dll。C++里面是二进制,C#里面是中间语言IL。本质是两种文件,碰巧用一样的后缀。C# dll还有专用名称,叫程序集Assembly。程序集可以调用,可以反编译查看,不能修改,不能直接运行。VS打包dll时它依赖的dll会全部一起拷贝过去。大型Unity项目通常会划分多dll。Unity划分多dll开发一种方式是创建asmdef,把属于此程序集的脚本放在里面及其子文件夹。

Jesui的博客 496

DLL注入实验笔记

MSDN已经说明了DllMain可以省略,但这里不能省略。原因很简单,查看DllMain定义的形参就知道是什么回事啦。当应用程序加载DLL时会发送消息到DllMain函数的第二个参数。利用这个特性,加载的DLL就可以立刻响应里面的功能函数啦!!下面是实验的代码:#include DWORD WINAPI ThreadProc(PVOID lp); BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpRese

pDaren的专栏 931

Dll学习笔记

比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EX

crbrave的专栏 1040

DLL中使用资源的笔记

内容是读这个博客的笔记,基本一样,但不记不踏实。作者写的很详细。 http://blog.csdn.net/rivershan/article/details/15789 分MFC DLL 和Win32 DLL  (一) 在Win32 DLL 中使用资源很简单

ezhong0812的专栏 1158

C++笔记-DLL的编写与调用

目录 基本概念 代码与实例 基本概念 Visual Studio的编译环境下,DLL分为3类: 非MFC的DLL,使用SDK API进行编程,能被所有语言调用。 MFC规则DLL,可以使用MFC进行编程,能被其他语言调用。 MFC扩展DLL,可以使用MFC进行编程,但只能被MFC编写的程序调用。 // dllmain.cpp : 定义 DLL 应用程序的入口点...

IT1995的博客 7001
下一篇: 注册自定义URL协议
dropme
博客等级 码龄24年 16粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值