DLL,你能搞定么?(很简单的问题,分值不简单呀:)

leiaaa 2003-09-29 04:09:49
关于dll的调用问题,各位根据自己的经验发表点意见,这个东西到底怎么调用,有什么好处,我是个初学者,希望大家多多指点。
...全文
31 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
year2000bug 2003-10-06
  • 打赏
  • 举报
回复
//这是我的一个dll文件调用的接口.
unit StrFuncApi;

interface
uses
Classes
,SysUtils
;
//字符函数
function IsInteger(Numstr:string):boolean;stdcall;
function GetPYIndexChar( hzchar:string):char;stdcall;
function SmallTOBig(small:real):string;stdcall;
function IsDigit(ch: char): boolean;stdcall;
function IsUpper(ch: char): boolean;stdcall;
function IsLower(ch: char): boolean;stdcall;
function ToUpper(ch: char): char;stdcall;
function ToLower(ch: char): char;stdcall;
function ScanStr(ToScan: PChar; Sign: Char):PChar;stdcall;
function IsInt(AStr: string): Boolean;stdcall;
function IsFloat(AStr: string): Boolean;stdcall;
function CopyStrLeft(ch: Char; str: string): string;stdcall;
function CopyStrRight(ch: Char; str: string): string;stdcall;
function left(str:string;Num:integer):string;stdcall;
function right(str:string;Num:integer):string;stdcall;
function mid(str:string;MidNum:integer;Num:integer):string;stdcall;

//----------------------------begin import dll---------------------------//
implementation
//字符函数
function IsInteger(Numstr:string):boolean;stdcall;external 'str';
function GetPYIndexChar( hzchar:string):char;stdcall;external 'str';
function SmallTOBig(small:real):string;stdcall;external 'str';
function IsDigit(ch: char): boolean;stdcall;external 'str';
function IsUpper(ch: char): boolean;stdcall;external 'str';
function IsLower(ch: char): boolean;stdcall;external 'str';
function ToUpper(ch: char): char;stdcall;external 'str';
function ToLower(ch: char): char;stdcall;external 'str';
function ScanStr(ToScan: PChar; Sign: Char):PChar;stdcall;external 'str';
function IsInt(AStr: string): Boolean;stdcall;external 'str';
function IsFloat(AStr: string): Boolean;stdcall;external 'str';
function CopyStrLeft(ch: Char; str: string): string;stdcall;external 'str';
function CopyStrRight(ch: Char; str: string): string;stdcall;external 'str';
function left(str:string;Num:integer):string;stdcall;external 'str';
function right(str:string;Num:integer):string;stdcall;external 'str';
function mid(str:string;MidNum:integer;Num:integer):string;stdcall;external 'str';

end.
Seahilly 2003-10-06
  • 打赏
  • 举报
回复
我回了多个有关DLL的贴子,你可以看看。
bluebottle 2003-10-06
  • 打赏
  • 举报
回复
怎样知道一个程序调用的DLL并控制呢?如果只是EXE,其它程序很容易将它的进程结束掉,但如果调用了DLL怎样正确干净地结束它呢~???能不能自动关闭所有DLL??能不能在DLL被调用时动态将这个DLL更新呢?????
急用!!!!
happyxhl 2003-09-30
  • 打赏
  • 举报
回复
还有一点就是将你的程序代码保护起来,如加密的函数过程
dickeybird888 2003-09-30
  • 打赏
  • 举报
回复
我觉得修改和维护方便。
leiaaa 2003-09-30
  • 打赏
  • 举报
回复
谢谢各位的指点,不过我邮电部明白,在调用过程中有些语句我不明白,是不是有什么固定的格式呀?像external 什么的,他们有什么作用?希望大家多多指点,我可以加分的
wz蝈蝈 2003-09-29
  • 打赏
  • 举报
回复
在调用动态链接库时应注意, 所需动态链接库须与应用程序在同一目录或Windows System 目录下。
动态链接库是 Windows下程序组织的一种重要方式,使用动态链接库可以极大地保护用户在不同开发工具、不同时期所做的工作,提高编程效率。
wz蝈蝈 2003-09-29
  • 打赏
  • 举报
回复
动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可以实现一些一般程序所不能实现的功能,如实现windows的HOOK、ISAPI等。同时,DLL还为不同语言间代码共享提供了一条方便的途径。因而DLL在编程时应用较为广泛,本文将介绍如何在 Delphi 中建立和使用DLL。

从使用效果看,DLL和unit 很像,它们都可以被别的工程模块所调用,但二者在内部的实现机制上确存在着差别。如果一个程序模块中用uses语句引用了某个unit,编译程序在编译该模块时,便会连同unit一起编译,并把编译后的可执行代码链接到本程序模块中,这就是一个程序模块能够调用所引用unit中过程和函数的原因。当同一个unit被多个工程所引用时,则每个工程中都含有该unit的可执行代码,当含有该unit的多个工程同时执行时,unit的可执行代码会随不同工程而多次被调入内存,造成内存资源的浪费。DLL则不同,它即使被某个工程调用,编译后仍是独立的,也就是说编译后,一个DLL库形成一个单独的可执行文件,而不与任何其它的可执行文件连接在一起,因而DLL库并不从属于某个特定的工程,当多个工程调用同一个DLL库时只有第一个工程把DLL库调入内存,其余工程并不重复调入同一个DLL库到内存,而是到同一个共享内存区读取。并且,DLL的执行代码是在程序运行期间动态调入的,而不是如unit在程序运行时就与整个工程一起调入内存。这样便可消除unit带来的相同代码多处占用内存的弊病。
Delphi_Li 2003-09-29
  • 打赏
  • 举报
回复
1、DLL调用有两种方式:静态和动态

静态调用的例子:
//声明原型
Function NetApiBufferFree( Buffer : Pointer) : NET_API_STATUS; StdCall; External 'NETAPI32.DLL';
//然后按照普通函数的方法使用!!!

动态调用的例子:
//函数类型声明:
Type
TChangeServiceConfigA = function (hService: SC_HANDLE; dwServiceType, dwStartType,
dwErrorControl: DWORD; lpBinaryPathName, lpLoadOrderGroup: PAnsiChar;
lpdwTagId: LPDWORD; lpDependencies, lpServiceStartName, lpPassword,
lpDisplayName: PAnsiChar): BOOL; stdcall;

if ADVAPIHandle=0 then //获取DLL句柄
ADVAPIHandle:=loadlibrary(advapi); //失败,加载DLL
if ADVAPIHandle<>0 then begin //加载成功
try
_ChangeServiceConfigA:=getprocaddress(ADVAPIHandle,pchar('ChangeServiceConfigA')); //获取函数地址
Except
End;

//使用后使用不要忘记FreeLibrary!!!

静态调用比较消耗资源!!!
动态调用比较繁琐!!!

如果不明白,最好看看《Delphi 5程序员指南》这本书,上面讲得很明白!!!
snowfog 2003-09-29
  • 打赏
  • 举报
回复
调用:
function Test(a: Integer; b: String): Integer;external 'Test1.Dll';
好处:
1、多种语言之间相互调用。
2、用DLL封装接口,便于软件升级。
3、简单易用,比COM简单。
jy_1201 2003-09-29
  • 打赏
  • 举报
回复
DLL的优点:
1、利用DLL可在使程序在运行时载入代码,而无需编译到程序中。
2、使程序模块化,方便修改、维护程序。

调用可分为显示调用和隐式调用。
mengxiang5160 2003-09-29
  • 打赏
  • 举报
回复
这是一个简单的调用dll的程序 可能对你有一些帮助
library jiemian;

uses
SysUtils,
forms,
Classes,
Unit1 in 'Unit1.pas' {Form1};


{$R *.res}
function showform:integer;stdcall;
var
form:tform1;
begin
form:=tform1.Create(application);
result:=form.ShowModal;
form.Free;
end;
exports
showform;

begin
end.
调用窗体的代码
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
function showform:integer;stdcall;
external 'd:\aaa\添加界面\jiemian.dll';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
showform;
end;

end.

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧