如何在DLL Delphi中使用IdFTP

时间:2014-12-18 11:53:21

标签: delphi dll indy-9

当我注入DLL时,ShowMessage工作正常,但是当我使用IdFtp远程进程崩溃时。

library FTP_DLL;

uses
SysUtils,Classes,IdFTP,Dialogs;

{$R *.res}

var
IdFTP1: TIdFtp = nil;


begin
  IdFTP1.Host := 'My ftp server';
  IdFTP1.UserName := 'user';
  IdFTP1.Password := 'password';
  IdFTP1.Connect;
  IdFTP1.Put('C:\test.txt','test.txt',False);
  ShowMessage('ok') ;
end.

谢谢。

1 个答案:

答案 0 :(得分:5)

这里最令人震惊的问题是代码在DllMain内运行。对DllMain允许的操作有严格的限制。我非常确定你是以多种方式违反规则的。

您应该移动此代码,使其超出DllMain。生成一个新线程来运行代码,允许来自DllMain的东西,或者在导出的函数中执行代码。

排除后,您需要实际实例化您使用的对象。目前你的初始化时间如下:

var
  IdFTP1: TIdFtp = nil;

尝试使用IdFTP1做任何事情显然都会失败。您将需要实例化一个对象。我猜你习惯于将组件放到设计图面上,让框架为你实例化一切。嗯,这不是一个选项,你需要明确地创建你使用的对象。

也许你可以试试这个:

library FTP_DLL;

uses
  IdFTP;

procedure Test; stdcall;
var
  IdFTP: TIdFtp;
begin
  IdFTP := TIdFtp.Create(nil); // pass nil as the owner, we take charge of lifetime
  try
    IdFTP.Host := 'My ftp server';
    IdFTP.UserName := 'user';
    IdFTP.Password := 'password';
    IdFTP.Connect;
    IdFTP.Put('C:\test.txt','test.txt',False);
  finally
    IdFTP.Free;
  end;
end;

exports
  Test;

begin
end.