[英]How to use IdFTP inside a DLL Delphi
當我注入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.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.