Fråga : Using wininet.dll med vba kodifiera inom makro för Excel 2003 på serveren R2 för fönster 2008. Ftp-hängningar

Vi använder programmera för applikation för Windows internet (WinINet) har kontakt (wininet.dll) med VBAEN kodifierar efter i Microsoft Excelspring 2003 på den slutliga serveren R2 för Windows server 2008.  Den hängningar för 20-45 understöder, når det har utfört fodrablnRcen = FtpPutFilen (lngINetConn, OutFile1, txt, 1, 0), men stilla avslutar den satta FTPEN.  På vårt Windows Xp /2003 bearbetar med maskin den satta FTPEN körningar ögonblickligen och gör inte lngINet för
för
för hang.
dunkel som dunkel lngINetConn för Long
lngINet = för InternetOpen (”ServerName”, 1, vbNullString, vbNullString, 0)
som blnRc för
för Long
lngINetConn = för InternetConnect (lngINet, server, 0, användaren, pwd, 1, 0, 0)
dunkel blnRc som blnRc för
för Boolean
blnRc = för FtpPutFile (lngINetConn, OutFile1, txt, 1, 0)
= för FtpDeleteFile (lngINetConn, loggar),
= FtpDeleteFile (lngINetConn, utskottsvaror för )
 blnRc = lngINet
för lngINetConn
InternetCloseHandle för

InternetCloseHandle för FtpDeleteFile (lngINetConn, resonerar),
, om den gör en skillnad men serveren det, är inte sure FTPing till är för http://msdn.microsoft.com/en-us/library/aa383630(v=VS.85).aspx” för href= för

en rel= " nofollow "” för _blank” target= > http://msdn.microsoft.com/ en-us/library/aa383630 (v=VS.85) .aspx
" klar "

Svar : Using wininet.dll med vba kodifiera inom makro för Excel 2003 på serveren R2 för fönster 2008. Ftp-hängningar

Här du har en fördjupad version av FtpPutFile…, Såväl som pumpa meddelanden till UIEN, (FtpPutFileEx) den beställnings- metoden som kan beräkna informationen om byten för framsteg.

Användning:
 FtpPutFileEx ”ftp.server.com”, ”användaren”, ”passerar”, ”c:\windows\system32\calc.exe”,” /TEST/calc.exe ",

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
Explicit alternativ
'egl1044
Privata Const BUF_SIZE = standard 4096 '4KB fungera som buffert för FTP
 
Privata Const INVALID_HANDLE_VALUE = (- 1)
Privata Const OPEN_EXISTING = &H3&
Privata Const GENERIC_READ = &H80000000
Privata Const GENERIC_WRITE = &H40000000
Privata Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Privata Const INTERNET_SERVICE_FTP = 1
Privata Const INTERNET_DEFAULT_FTP_PORT = 21
Privata Const FTP_TRANSFER_TYPE_UNKNOWN = 0
 
Privat förklara fungerar den CreateFileW liben ”kernel32” (ByVal lpFileName som Long, ByVal dwDesiredAccess som Long, ByVal dwShareMode som Long, ByVal lpSecurityAttributes som Long, ByVal dwCreationDisposition som Long, ByVal dwFlagsAndAttributes som Long, ByVal som är hTemplateFile som Long) som Long
Privat förklara fungerar den ReadFile liben ”kernel32” (ByVal som var hFile som Long, ByVal lpBuffer som Long, ByVal nNumberOfBytesToRead som Long, ByRef lpNumberOfBytesRead som Long, ByVal lpOverlapped som Long), som Long
Privat förklara fungerar den CloseHandle liben ”kernel32” (ByVal hObject som Long) som Long
Privat förklara fungerar den InternetOpenW liben ”wininet” (ByVal som är lpszAgent som Long, ByVal dwAccessType som Long, ByVal lpszProxyName som Long, ByVal lpszProxyBypass som Long, ByVal dwFlags som Long) som Long
Privat förklara fungerar den InternetConnectW liben ”wininet” (den ByVal hInternetSessionen som Long, ByVal sServerName som Long, ByVal nServerPort som Long, ByVal sUsername som Long, ByVal sPassword som Long, ByVal lService som Long, ByVal lFlags som Long, ByVal lcontext som Long) som Long
Privat förklara fungerar den InternetWriteFile liben ”wininet” (ByVal som är hFile som Long, ByVal lpBuffer som Long, ByVal dwNumberOfBytesToWrite som Long, ByRef lpdwNumberOfBytesWritten som Long), som Long
Privat förklara fungerar den InternetCloseHandle liben ”wininet” (ByVal hInternet som Long) som Long
Privat förklara fungerar den FtpOpenFileW liben ”wininet” (ByVal hConnect som Long, ByVal lpszFileName som Long, ByVal dwAccess som Long, ByVal dwFlags som Long, ByVal dwContext som Long) som Long
Privat förklara fungerar den GetFileSize liben ”kernel32” (ByVal som är hFile som Long, ByRef lpFileSizeHigh som Long) som Long

Dunkelt fungera som buffert (BUF_SIZE) som byte
Dunkla dwReadBytes som Long
Dunkla dwWrittenBytes som Long
Dunkelt hOpen som Long
Dunkel hConnect som Long
Dunkel hInternet som Long
Dunkelt hFile som Long
 
 
Offentliga underFtpPutFileEx (_,
  ByVal szServer som stränger, _,
  ByVal szUser som stränger, _,
  ByVal szPassword som stränger, _,
  szLocalFile ByVal som stränger, _,
  szServerFile ByVal som stränger)
  
  Dunkel dwStatus som Long
  Dunkelt dwLoFileSize som Long
  Dunkelt dwHiFileSize som Long
  Dunkelt dwPercent som Long
  
  '/init
  hOpen = InternetOpenW (0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0)
   
  '/förbind till en ftp-server
  hConnect = InternetConnectW (hOpen, StrPtr (szServer), INTERNET_DEFAULT_FTP_PORT, StrPtr (szUser), StrPtr (szPassworden), INTERNET_SERVICE_FTP, 0, 0),
   
  Om hConnect = 0 därefter
    Rengöring
    Debug.Print ”InternetConnectW ()” & Err.LastDllError
    Gå ut suben
  Avsluta om
   
  '/få handtaget för filenamen som ska är skriftlig till en ftp-server
  hInternet = FtpOpenFileW (hConnect, (szServerFile) StrPtr, GENERIC_WRITE, FTP_TRANSFER_TYPE_UNKNOWN, 0)
   
  Om hInternet = 0 därefter
    Rengöring
    Debug.Print ”FtpOpenFile ()” & Err.LastDllError
    Gå ut suben
  Avsluta om
   
  '/få handtaget för lokal sparar för att läsa byte
  hFile = CreateFileW (StrPtr (”\ \? \” & szLocalFile), GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0)
   
  Om hFile = INVALID_HANDLE_VALUE därefter
    Rengöring
    Debug.Print ”CreateFileW ()” & Err.LastDllError
    Gå ut suben
  Avsluta om
  
  '// får lokal sparar storleksanpassar för framsteg. Service för detta exempel
  '    endast upp till 2GB av status som anmäler framsteg.
  dwLoFileSize = hFile GetFileSize (, dwHiFileSize),
  
  '/läs lokalen sparar, skriver serveren sparar byte
  Gör
    Om hFile ReadFile (, VarPtr (fungera som buffert (0)), BUF_SIZE, dwReadBytes, 0) därefter
      Om InternetWriteFile (hInternet, VarPtr (fungera som buffert (0)), dwReadBytes, dwWrittenBytes) därefter
        'Spåra beloppet av skriftliga byte och procentsats.
        dwStatus = (dwStatusen + dwWrittenBytes)
        dwPercent = (dwStatusen/dwLoFileSize) * 100
        'Label1.Caption = dwPercent
      Avsluta om
    Annars
      Gå ut gör
    Avsluta om
    DoEvents
  Kretsa till dwReadBytes = 0
   
  ”Gjorda” Debug.Print,
  '/rengöring
  Rengöring
  Raderingen fungera som buffert
   
  
Avsluta suben
 
Privat underrengöring ()
   
  Om hOpen <> 0 därefter
    InternetCloseHandle hOpen
    hOpen = 0
  Avsluta om
  Om hConnect <> 0 därefter
    InternetCloseHandle hConnect
    hConnect = 0
  Avsluta om
  Om hInternet <> 0 därefter
    InternetCloseHandle hInternet
    hInternet = 0
  Avsluta om
  Om hFile > 0 därefter
    hFile CloseHandle
    hFile = INVALID_HANDLE_VALUE
  Avsluta om
   
Avsluta suben
Andra lösningar  
 
programming4us programming4us