动态链接库调用问题(100分)

  • 主题发起人 主题发起人 wuliaoderen
  • 开始时间 开始时间
W

wuliaoderen

Unregistered / Unconfirmed
GUEST, unregistred user!
我自己作的dll,其中包含窗口。当主程序调用dll的函数时,会调出dll中相应的窗口。
我的问题是,当主程序调用完成后,退出主程序后就会有一个读地址错误!!!“runtime
error 216 at 0038318A”
求助高手,这是什么问题呀!!!
 
是你想用的东西已经被释放掉了的缘故
 
楼主所的错误的原因很多 能不能把代码贴出来
 
//============动态链接库代码===============
uses
SysUtils,
Classes,
Registry,
Windows,
Dialogs,
U_dlkz in 'U_dlkz.pas' {Frm_dlkz},
U_sjjs in 'U_sjjs.pas' {Frm_sjjs},
U_public in 'U_public.pas';

{$R *.res}

function Date_Check:boolean;stdcall;
var
key:word;
date1,date2:pchar;
begin
result:=false;
key:=strtoint(ReadReg('FlagC'));
if inttostr(key) = '1' then
begin
result:=true;
exit;
end;
if decryp(key,ReadReg('FlagA')) = 'false' then //是否启用日期限制
begin
result:=true;
end
else
begin
//================将当前日期和注册表中的限制日期进行比较=====================
date1:=pchar(decryp(key,ReadReg('FlagD')));
date2:=pchar(decryp(key,ReadReg('FlagE')));
if (formatdatetime('yyyy-MM-dd',date) < date1) or (formatdatetime('yyyy-MM-dd',date) > date2) then
begin
if decryp(key,ReadReg('FlagB')) = 'true' then
begin
Randomize;
WirteReg('FlagC',inttostr(Random(999999)));
key:= strtoint(ReadReg('FlagC'));
WirteReg('FlagA',encryp(key,'true'));
WirteReg('FlagB',encryp(key,'false'));
end;
showmessage('您的使用期限已到,请与软件供应商联系,续订软件服务!');
try
Frm_sjjs:= TFrm_sjjs.Create(nil);
Frm_sjjs.ShowModal;
finally
Frm_sjjs.Free;
end;
end
else
begin
result:=true;
end;
end;
end;

function Date_Control(pswd:pchar):boolean;stdcall;
begin
result:=true;
if pswd = '6852903' then
begin
try
Frm_dlkz:= TFrm_dlkz.Create(nil);
Frm_dlkz.ShowModal;
result:=false;
finally
Frm_dlkz.Free;
end;
end;
end;

exports
Date_Check,Date_Control;
begin
end.

//============主程序调用=============
unit umain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, DB, DBTables, StdCtrls,ActnList, ComCtrls, ExtCtrls,
Buttons, shellapi, XPMenu, jpeg, XPMan;

implementation
{$R *.dfm}

function Date_Check:boolean;stdcall;external 'demo.dll';
procedure Tmain.FormCreate(Sender: TObject);
begin
if not Date_Check then application.Terminate;
end;

这是我的代码。
 
动态库单步调试一下就知道了
 
这类问题在Delphi中不是很好查
如果有时间
那就把所有功能代码都注释掉
只留下函数定义
看看编译后还出不出错
如果不出错了,那你再一点一点的把注释去掉
直到问题再次出现
你就找到问题点了
 
多人接受答案了。
 
后退
顶部