簡體   English   中英

如何在DLL Delphi中使用IdFTP

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM