2016-08-11 3 views
1

Word 템플릿 추가 기능 (.dtom)을 만들었습니다. FTP를 사용하여 서버에서 파일을 다운로드합니다. 방화벽이 꺼져 있으면 잘 작동합니다. 방화벽이 켜져 있으면 다운로드를 허용하지 않습니다. 경우에 따라 방화벽은 바이러스 백신을 사용하여 설정됩니다.Word 템플릿 VBA에서 wininet.dll을 사용하여 방화벽이 켜져 있으면 FTP에서 파일을 다운로드 할 수 없습니다.

이것은 방화벽이 꺼져 있으면 잘 작동하는 코드입니다.

'Add DLL runtime 

Private Declare PtrSafe Function InternetGetConnectedState Lib "wininet.dll" _ 
(ByRef dwflags As Long, ByVal dwReserved As Long) As Long 

Private Declare PtrSafe Function InternetOpenA Lib "wininet.dll" (_ 
    ByVal sAgent As String, _ 
    ByVal lAccessType As Long, _ 
    ByVal sProxyName As String, _ 
    ByVal sProxyBypass As String, _ 
    ByVal lFlags As Long) As Long 

Private Declare PtrSafe Function InternetConnectA Lib "wininet.dll" (_ 
    ByVal hInternetSession As Long, _ 
    ByVal sServerName As String, _ 
    ByVal nServerPort As Long, _ 
    ByVal sUsername As String, _ 
    ByVal sPassword As String, _ 
    ByVal lService As Long, _ 
    ByVal lFlags As Long, _ 
    ByVal lcontext As Long) As Long 

Private Declare PtrSafe Function FtpGetFileA Lib "wininet.dll" (_ 
    ByVal hConnect As Long, _ 
    ByVal lpszRemoteFile As String, _ 
    ByVal lpszNewFile As String, _ 
    ByVal fFailIfExists As Long, _ 
    ByVal dwFlagsAndAttributes As Long, _ 
    ByVal dwflags As Long, _ 
    ByVal dwContext As Long) As Long 

Private Declare PtrSafe Function InternetCloseHandle Lib "wininet" (_ 
    ByVal hInet As Long) As Long 

Private Const INTERNET_FLAG_PASSIVE   As Long = &H8000000 


Public Sub downloadFile() 
    If (fileExists = True) Then 
     Kill folderLocation 
    End If 
    strRemoteFile = "/MyFile.xml" 
    strLocalFile = folderLocation 
    strHost = "XXX.XXX.XXX.XXX" 

    lngPort = 21 
    strUser = "myuser" 
    strPass = "mypassword" 
    'usage 
    'FtpDownload "/TEST/test.html", "c:\test.html", "ftp.server.com", 21, "user", "password" 
    Dim hOpen As Long 
    Dim hConn As Long 

    hOpen = InternetOpenA("FTPGET", 1, vbNullString, vbNullString, 1) 
    hConn = InternetConnectA(hOpen, strHost, lngPort, strUser, strPass, 1, INTERNET_FLAG_PASSIVE, 2) 

    If FtpGetFileA(hConn, strRemoteFile, strLocalFile, 1, 0, FTP_TRANSFER_TYPE_UNKNOWN Or INTERNET_FLAG_RELOAD, 0) Then 
     Debug.Print "done" 
    Else 
     Debug.Print "fail" 
    End If 

    InternetCloseHandle hConn 
    InternetCloseHandle hOpen 
End Sub 

방화벽이 켜져있는 경우 다운로드 방법을 제안하십시오. 또한 방화벽 문제를 해결할 수있는 다른 방법이 있다면 제안하십시오. 당신은 수동 FTP 모드를 사용할 필요가

+0

이것은 VBA가 아닌 방화벽 문제입니다. Word가 PC 방화벽 구성에서 아웃 바운드 연결을하도록 허용 할 것을 제안하십시오. FTP 포트와 특정 IP 주소로 제한 될 수 있습니다. – PatricK

+0

@ PatricK 더 큰 시나리오에서 알려 드리겠습니다. 내 사용자에게이 추가 기능을 제공했습니다. 모두 다른 종류의 바이러스 백신을 사용합니다. 나는 모든 사람들이 안티 바이러스 구성을 설정할 수 있도록 도와 줄 수는 없다. 따라서 바이러스 백신 보안을 건너 뛰는 방법이 필요합니다. 귀하의 솔루션이 모든 바이러스 백신을 건너 뛰거나 개별적으로 확인해야합니까? ( –

+0

Excel에서 'http : //'링크를 직접 열 수 있음을 알고 있습니다. 아마도 Word는 'ftp : //'와 유사 할 수 있습니다. 바이러스 백신이 치료할 것인지 웹 서버/공유 클라우드 드라이브로 xml 파일을 사용할 수 있도록 설정해야 할 수도 있습니다. – PatricK

답변

0

을 (. 예 맥 VBA에서 우리는 VBA에서 실행할 수있는 MacScript에 컬 명령을 사용하여 파일을 다운로드 할 수 있습니다) : 활성 모드로

InternetConnectA(hOpen, strHost, lngPort, strUser, strPass, 1, INTERNET_FLAG_PASSIVE, 2) 

InternetConnect 기본 설정을하는 방화벽이나 NAT가 관련되어있는 경우 대부분 사용할 수 없습니다.

패시브 모드를 사용해야하는 이유를 이해하려면 내 문서 Active and Passive FTP connection modes을 참조하십시오.

+0

내가 이해하는 것은 : o hConn = InternetConnectA (hOpen, strHost, lngPort, strUser, strPass, 1, 0, 2) 행을 hconn = InternetConnectA (hOpen, strHost, lngPort, strUser, strPass, 1, INTERNET_FLAG_PASSIVE, 2) 행으로 대체하십시오. 그러나 'INTERNET_FLAG_PASSIVE'의 가치는 무엇입니까? 제발 제안 해주세요. –

+0

'0x08000000' (VBA의 '& H08000000')은 https://msdn.microsoft.com/en-us/library/windows/desktop/aa383661.aspx –

+0

을 참조하십시오. 여전히 작동하지 않습니다. 내 질문에 내 코드를 편집했습니다. 내가 누락 된 것이 있으면 제게 제안 해 주시겠습니까? –

관련 문제