当我注入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.
谢谢。
答案 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.