2014-12-18 8 views
0

DLL을 삽입하면 ShowMessage는 정상적으로 작동하지만 IdFtp를 사용하면 원격 프로세스가 중단됩니다.IdFTP를 DLL 내부에서 사용하는 방법

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

EAccessViolation 오류 – bestyasser

+5

당신은 그것을 사용하는 객체를 생성해야합니다. –

+0

@LittleHelper IdFTP1 : TIdFtp = nil; ? – bestyasser

답변

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. 
+0

죄송합니다. 내 호기심, DLL에 대한 제한 사항은 무엇입니까? –

+0

@LittleHelper 내가 링크 한 문서는'DllMain'에서 할 수있는 것에 대한 몇 가지 범위를 가지고 있습니다. 나는 거기에서 시작할 것입니다. 레이몬드 첸 (Raymond Chen)도 그의 블로그에서 이것을 다루었습니다. –

+0

오, 링크를 알아 차리지 못했습니다, 감사합니다! –