乐者为王

Do one thing, and do it well.

PowerBuilder中如何调用默认的邮件客户端

在某个窗口上有一个文字超链接(StaticHyperLink控件),点击后就打开默认的邮件客户端,并且把指定收件人的邮件地址填写到收件人地址栏中。

如果在StaticHyperLink控件的URL中使用mailto协议,的确能够做到上述的要求。但是有个问题是在打开邮件客户端前总是先打开一个IE窗口,这样使得用户的体验非常差。而PowerBuilder自带的mailsession对象则只能调用Outlook Express,根本就不用考虑。

查找资料后发现可以通过调用外部函数ShellExecute来解决这个问题。首先在Global/Local External Functions中添加如下声明:

1
2
3
4
5
6
function ulong ShellExecuteA(ulong hwnd, &
                            string lpOperation, &
                            string lpFile, &
                            string lpParameters, &
                            string lpDirectory, &
                            long nShowCmd) library "shell32"

然后在StaticHyperLink控件的Clicked事件中添加代码:

1
2
3
4
5
6
7
8
9
string ls_null

SetNull(ls_null)
ShellExecuteA(Handle(parent), &
            "open", &
            "mailto:yourname@example.com", &
            ls_null, &
            ls_null, &
            1)    // SW_SHOWNORMAL

还有要注意4个string类型的参数,一定是string xxx,千万不要使用下面这种声明方式:

1
2
3
4
5
6
function ulong ShellExecuteA(ulong hwnd, &
                             ref string lpOperation, &
                             ref string lpFile, &
                             ref string lpParameters, &
                             ref string lpDirectory, &
                             long nShowCmd) library "shell32"

刚开始的时候我就使用了这种声明方式,结果每次程序执行到ShellExecuteA时都会弹出一个异常对话框,搞的我非常郁闷。

Comments