在DLL动态连接库里面检测信箱的问题(POP3)(100分)

  • 主题发起人 主题发起人 jame
  • 开始时间 开始时间
J

jame

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个使用DLL检测邮箱的程序,是我第一次用DLL写,而且我也没有这方面的资料.所以
贴出来请大家指正,可以直接发到我的邮箱:jame.swnu@263.net.万分感谢!
我的问题:
1.这样可否正确运行(最近我家一直无法上网)
2.可否正确传递参数给VC的程序?
3.如何写函数自己将DLL从内存撤出?
4.如何减少DLL体积?(我这个有331K)
分数不多,主要在于讨论.请各位大侠出手为盼!
library Dlltest;
uses
SysUtils,
Classes,
inifiles,
mailplus in 'mailplus.pas';

{$R *.RES}

type
Pmail_list = ^mail_ser_list;
mail_ser_list = record
header:string[8]; //头部识别码 ascII jW#07#09Me#9#7
key :boolean;
ISPname:string[30]; //连接名称
Username:string[30];//用户姓名
MailAddr:string[60];//邮件地址
//SMTP
SmtpServ:string[50];//smtp服务器
SMTPport:integer; //SMtp端口
DefaultSmtp:integer; //是否默认服务器
//POP3
POP3serv:string[50];//POP3服务器
POP3port:integer; //POrt端口
DefaultPOP:integer; //是否可以使用
Pop3User:string[30];//POP用户名
POP3Pass:string[30];//POP密码
POP3leave:integer; //是否在服务器留下备份
Pop3Time:Tdatetime;//上次收心时间
ender:string[4]; //尾部识别码 ascII #4#9
end;

function IS_newletter(var Rlink_name:Pwidechar):boolean;export;cdecl;
const
constheader = '*JW2000*';
constender = 'ED'+#$D + #$A;
var
link_list:tlist;
Plink_rec:Pmail_list;
link_rec :mail_ser_list;
now_time:tdatetime; //现在时间
//
I,T:integer;
FN:file;
S:string;
link_name:string;
//
nmpop31:tlxpop;
ini:tinifile;
begin
//读取一个连接
try
link_list := tlist.Create;
link_name := '';
//这里要看ini文件里面的标志为
try
if fileexists('mailbox.ini') then
begin
assignfile(FN,'mailbox.ini');
reset(FN,1);
T := filesize(FN);
for I:= 0 to (T div sizeof(link_rec)) - 1 do
begin
new(Plink_rec);
blocKread(FN,linK_rec,sizeof(linK_rec));
Plink_rec^.header := constheader; Plink_rec.ender:= constender;
Plink_rec^.ISPname:= link_rec.ISPNAME; Plink_rec^.Username := link_rec.Username;
Plink_rec^.MailAddr:=link_rec.MailAddr; Plink_rec^.SmtpServ := link_rec.SmtpServ;
Plink_rec^.SMTPport:=link_rec.SMTPport; Plink_rec^.DefaultSmtp:= link_rec.DefaultSmtp;
Plink_rec^.Pop3User:=link_rec.Pop3User; Plink_rec^.key := link_rec.key;
Plink_rec^.POP3serv:=link_rec.POP3serv; Plink_rec^.POP3port := link_rec.POP3port;
Plink_rec^.POP3Pass:=link_rec.POP3Pass; Plink_rec^.POP3leave:= link_rec.POP3leave;
Plink_rec^.DefaultPOP := link_rec.DefaultPOP;
Plink_rec^.Pop3Time := Link_rec.Pop3Time;
Link_list.Add(Plink_rec);
end;
closefile(FN);
end;
finally
end;
//取得该连接名字和上次时间
now_time := now();
try
//提示方式:连接名字+回车换行+连接名字+..没有新邮件的不列出
ini:=Tinifile.create('config.ini');
S:=ini.readstring('onesendrecieve','recipe','0');
if S = '1' then
begin
ini.free;
result := false;
exit;
end
else
ini.writestring('onesendrecieve','recipe','1' );
ini.free;
//开始连接
New(Plink_rec);
For I:=0 to link_list.Count - 1 do
begin
Plink_rec := link_list.Items;
NMpop31.free;
Nmpop31:=nil;
nmpop31:=tlxpop.Create(nil);
NMPOP31.Disconnect;
NMPOP31.DeleteOnRead := false;
NMPOP31.TimeOut := 5000;
//
If Plink_rec^.key then
else
continue;
NMPOP31.Host := Plink_rec^.POP3serv;
NMPOP31.Port := Plink_rec^.POP3port;
NMPOP31.UserID := Plink_rec^.Pop3User;
NMPOP31.Password:= Plink_rec^.POP3Pass;
//
if(NMPOP31.Connect=-1)then
continue;
//
IF(NMPOP31.MAILCOUNT>0)THEN
for T:= 0 To Nmpop31.MailCount - 1 do
begin
if(NMpop31.GetSummary(T+1)=-1)then continue;
//找到了新信
if NMpop31.Summary.poptime > Plink_rec^.Pop3Time then
begin
link_name := link_name + Plink_rec^.ISPname + #$D + #$A;
break;
end;
end;
end;
except
end;
finally
link_list.free;
Rlink_name := @link_name;
if link_name <> '' then
result := true
else
result := false;
nmpop31.free;
ini:=Tinifile.create('config.ini');
ini.writestring('onesendrecieve','recipe','0' );
ini.free;
nmpop31:=nil;
end;
end;

exports Is_newLetter Index 1;

End.
 
2.如果你是要用VC调用这个DLL,为什么不用VC写这个DLL呢?
不仅麻烦少,相信DLL的体积也会少得多。
3。DLL是动态连接库,你在程序中调用完毕后,可以马上把它卸载的呀。
4。同第二个问题。
 
to:johnyh
我不会用vc.我也不知道如何卸载请告诉我.
另:
程序如何改变为多线程的?
 
jame:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
先学通一个
 
4.如何减少DLL体积?(我这个有331K)
去掉那些Debug信息(在option中不选中, 然后重新build一下)
 
释放是在调用的程序中实现的,而不是在DLL本身实现。
 
多人接受答案了。
 
后退
顶部