0

当我注入 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.

谢谢你。

4

1 回答 1

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.
于 2014-12-18T12:01:16.927 回答