当我注入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)
谢谢.
这里最令人震惊的问题是代码在里面运行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)
| 归档时间: |
|
| 查看次数: |
1390 次 |
| 最近记录: |