****高手进来一下,DLL的函数如何动态调用!!*******(100分)

  • 主题发起人 主题发起人 todayisthursday
  • 开始时间 开始时间
T

todayisthursday

Unregistered / Unconfirmed
GUEST, unregistred user!
DLL可以动态引用,但DLL中的函数如何动态调用,不想写死在程序内!
谢谢
 
//先定义原形
TSetConn = function(Value: Boolean): Boolean;
//LibHandle 为DLL的句柄
//实现
function SetMethodCon(Flag: Boolean): Boolean;
var
SetConn: TSetConn;
begin
Result := False;
try
if LibHandle > 0 then begin
SetConn := GetProcAddress(LibHandle, 'SetConn');
SetConn(Flag);
Result := true;
end;

finally
end;
end;
 
如果函数是有参数的怎么办?谢谢
 
上面的例子不就是带参的吗
 
调用方法类型必须写死吧。 不然你怎么让它执行呢? 能动态改变的就是dll名称,函数名称, 但书函数的参数列表不定就没法调用了。
 
SetConn := GetProcAddress(LibHandle, 'SetConn');
改为
@SetConn := GetProcAddress(LibHandle, 'SetConn');更好
 
动态调用完整示例:(从上到下)
const
CommonDLL = 'CommonDLL.dll';

function G_EncryptAndKey(const ASrc: string; Key: string): string;


implementation

type
TEncryptAndKey = function(ASrc, Key: pchar): pchar;


var
EncryptAndKey: TEncryptAndKey;

////函数部份
function G_EncryptAndKey(const ASrc: string; Key: string): string;
var
HLib: THandle;
begin
Result := '';
HLib := LoadLibrary(CommonDLL);
if HLib = 0 then
begin
FreeLibrary(Hlib);
MessageBox(0, pChar('找不到指定的动态连接库' + CommonDLL), '错误', mb_iconwarning);
Exit;
end;
@EncryptAndKey := GetProcAddress(HLib, 'EncryptAndKey');//这应该重点看一眼,呵
if @EncryptAndKey = nil then
begin
FreeLibrary(Hlib);
exit;
end;
result := EncryptAndKey(Pchar(ASrc), pchar(Key));
FreeLibrary(Hlib);
end;
 
function G_EncryptAndKey(const ASrc: string; Key: string): string;
请问:const ASrc: string; Key: string 这两个参数是什么意思?谢谢
 
IT书生, [:D] 幸会
 
function G_EncryptAndKey(const ASrc: string; Key: string): string;
请问:const ASrc: string; Key: string 这两个参数是什么意思?谢谢
 
shangshang,你好,呵呵。
 
多人接受答案了。
 
后退
顶部