用Delphi开发动态库DLL

公司的ERP系统一直被邮件所烦。

以前在ERP里面发送邮件,采用的是一个在网上找的DLL文件,没有源码。

这个DLL文件采用的是SMTP方式,可以实现简单的邮件发送,更高级的功能就没有,比如副本,附件,以HTML方式发送等。

最近有一些时间,抽空就把这个问题解决了一下。

首先用Wireshark监控了一下这个DLL文件发送时的数据包,发现应该是用Delphi的Indy组件具体实现的。

Indy组件刚好会用,就用Delphi+Indy开发了一个自己的DLL邮件发送功能,解决了公司一直困扰的问题。

需要说明的是Delphi开发DLL供PowerBuilder调用过程中需要注意的一些问题:

1. Delphi要使用ActiveX Library方式,这样编译是生成的才是一个DLL文件。

2. 最好用一个单独的unit来存放具体的实现代码,这样的目的是方便可以建立另外一个测试用的application。例如,sendmail这个组件的所有实现代码都在sendimpl.pas里面,另外我又建立一个测试用的testform,这个测试程序直接包含sendimpl.pas就好了,很方便。

3. Delphi需要被外部调用的最好都是函数function,不要有过程procedure,我测试PowerBuilder调用过程总有问题。

4. Delphi每个需要被外部调用的函数都声明为stdcall调用。

5. Delphi需要被外部调用的函数里面如果有字符参数或者返回值,都用PChar类型,不要用String。

下面是一些参考代码片段:

1. Delphi里面的函数定义

function incvalue(const x: Integer): Integer; stdcall;
function UpperString(Msg: PChar): PChar; stdcall;
function SendMessageFile(sFile: PChar): Integer; stdcall;

2. Delphi里面声明需要被外部调用的函数

exports incvalue, UpperString, SendMessageFile;

3. PowerBuilder里面的外部函数声明

FUNCTION long incvalue(long fdf) Library "M:\projects\sendmail\sendmail.dll" 
FUNCTION int SendMessageFile( string sFile) Library "M:\projects\sendmail\sendmail.dll" 
FUNCTION string UpperString( string sFile) Library "M:\projects\sendmail\sendmail.dll" 

https://files.cnblogs.com/eastson/sendmail.rar