如何在DLL Delphi中使用IdFTP

bes*_*ser 0 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.
Run Code Online (Sandbox Code Playgroud)

谢谢.

Dav*_*nan 5

这里最令人震惊的问题是代码在里面运行DllMain.对你可以做的事情有严格的限制DllMain.我很确定你是以多种方式违反规则的.

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

在对其进行排序之后,您将需要实际实例化您使用的对象.目前你的初始化方式如下:

var
  IdFTP1: TIdFtp = nil;
Run Code Online (Sandbox Code Playgroud)

试图做任何事情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.
Run Code Online (Sandbox Code Playgroud)