当我注入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.
谢谢你。
这里最糟糕的问题是代码在内部运行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.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句