Vraag : Het gebruiken van wininet.dll met vbacode binnen de macro van Excel 2003 op vensters 2008 R2 server. FTP hangt

Wij gebruiken de de toepassing van Internet van Vensters (WinINet) programmeringsinterface (wininet.dll) met de volgende code VBA in Microsoft Excel 2003 die op Vensters de EindServer van de Server in werking stellen 2008 R2.  Het hangt 20-45 seconden na het uitvoeren van de lijn blnRc = FtpPutFile (lngINetConn, OutFile1, txt, 1, 0) maar voltooit nog gezet FTP.  Op onze machines van Vensters XP/2003 loopt gezet FTP ogenblikkelijk en niet hang.


Schemerige lngINet als Long
lngINet = („ServerName“, 1, het vbNullString, het vbNullString, 0)
Schemerige lngINetConn InternetOpen als Long
lngINetConn Schemerige blnRc = van InternetConnect (lngINet, server, 0, gebruiker, DOW, 1, 0, 0)

als Boolean
blnRc = FtpPutFile (lngINetConn, OutFile1, txt, 1, 0)

blnRc = FtpDeleteFile (lngINetConn,/> logboek blnRc = FtpDeleteFile (lngINetConn,/> weigeringen  blnRc = is FtpDeleteFile (lngINetConn,/> redenen

InternetCloseHandle lngINetConn
niet zekere InternetCloseHandle lngINet
als het een verschil maar de server maakt het FTPing is aan een zonsolaris 10 box.


http://msdn.microsoft.com/ en-us/library/aa383630 (v=VS.85) .aspx

Antwoord : Het gebruiken van wininet.dll met vbacode binnen de macro van Excel 2003 op vensters 2008 R2 server. FTP hangt

Hier hebt u een uitgebreide versie van FtpPutFile… (FtpPutFileEx) douanemethode die de byteinformatie voor vooruitgang evenals pompberichten aan UI kan berekenen.

Gebruik:
 FtpPutFileEx „ftp.server.com“, „gebruiker“, „pas“, „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:
Expliciete optie
'egl1044
Privé Const BUF_SIZE = 4096 '4KB standaardbuffer voor FTP
 
Privé Const INVALID_HANDLE_VALUE = (- 1)
Privé Const OPEN_EXISTING = &H3&
Privé Const GENERIC_READ = &H80000000
Privé Const GENERIC_WRITE = &H40000000
Privé Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Privé Const INTERNET_SERVICE_FTP = 1
Privé Const INTERNET_DEFAULT_FTP_PORT = 21
Privé Const FTP_TRANSFER_TYPE_UNKNOWN = 0
 
Privé verklaar de Lib „kernel32“ van CreateFileW van de Functie (ByVal lpFileName zoals lang, ByVal dwDesiredAccess zoals lang, ByVal dwShareMode zoals lang, ByVal lpSecurityAttributes zoals lang, ByVal dwCreationDisposition zoals lang, ByVal dwFlagsAndAttributes zoals lang, ByVal hTemplateFile zoals lang) zoals lang
Privé verklaar de Lib „kernel32“ van ReadFile van de Functie (ByVal hFile zoals lang, ByVal lpBuffer zoals lang, ByVal nNumberOfBytesToRead zoals lang, ByRef lpNumberOfBytesRead zoals lang, ByVal zoals lang) lpOverlapped zoals lang
Privé verklaar de Lib „kernel32“ van CloseHandle van de Functie (ByVal hObject zoals lang) zoals lang
Privé verklaar de Lib van InternetOpenW van de Functie „wininet“ (ByVal lpszAgent zoals lang, ByVal dwAccessType zoals lang, ByVal lpszProxyName zoals lang, ByVal lpszProxyBypass zoals lang, ByVal dwFlags zoals lang) zoals lang
Privé verklaar de Lib van InternetConnectW van de Functie „wininet“ (hInternetSession ByVal zoals lang, ByVal sServerName zoals lang, ByVal nServerPort zoals lang, ByVal sUsername zoals lang, ByVal sPassword zoals lang, ByVal lService zoals lang, ByVal lFlags zoals lang, ByVal lcontext zoals lang) zoals lang
Privé verklaar de Lib van InternetWriteFile van de Functie „wininet“ (ByVal hFile zoals lang, ByVal lpBuffer zoals lang, ByVal dwNumberOfBytesToWrite zoals lang, ByRef zoals lang) lpdwNumberOfBytesWritten zoals lang
Privé verklaar de Lib van InternetCloseHandle van de Functie „wininet“ (ByVal hInternet zoals lang) zoals lang
Privé verklaar de Lib van FtpOpenFileW van de Functie „wininet“ (ByVal hConnect zoals lang, ByVal lpszFileName zoals lang, ByVal dwAccess zoals lang, ByVal dwFlags zoals lang, ByVal dwContext zoals lang) zoals lang
Privé verklaar de Lib „kernel32“ van GetFileSize van de Functie (ByVal hFile zoals lang, ByRef lpFileSizeHigh zoals lang) zoals lang

Verduister Buffer (BUF_SIZE) als Byte
Verduister dwReadBytes zoals lang
Verduister dwWrittenBytes zoals lang
Schemerig hOpen zoals lang
Verduister hConnect zoals lang
Verduister hInternet zoals lang
Verduister hFile zoals lang
 
 
Openbare SubFtpPutFileEx (_
  ByVal szServer als Koord, _
  ByVal szUser als Koord, _
  ByVal szPassword als Koord, _
  ByVal szLocalFile als Koord, _
  ByVal szServerFile als Koord)
  
  Schemerige dwStatus zoals lang
  Schemerig dwLoFileSize zoals lang
  Schemerig dwHiFileSize zoals lang
  Verduister dwPercent zoals lang
  
  '/init
  hOpen = InternetOpenW (0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0)
   
  '/verbind met de FTPserver
  hConnect = InternetConnectW (hOpen, StrPtr (szServer), INTERNET_DEFAULT_FTP_PORT, StrPtr (szUser), StrPtr (szPassword), INTERNET_SERVICE_FTP, 0, 0)
   
  Als hConnect = 0 toen
    Schoonmaakbeurt
    Debug.Print „InternetConnectW ()“ & Err.LastDllError
    Sub van de uitgang
  Eind als
   
  '/krijg handvat voor filename die aan de FTPserver zal worden geschreven
  hInternet = FtpOpenFileW (hConnect, (szServerFile) StrPtr, GENERIC_WRITE, FTP_TRANSFER_TYPE_UNKNOWN, 0)
   
  Als hInternet = 0 toen
    Schoonmaakbeurt
    Debug.Print „FtpOpenFile ()“ & Err.LastDllError
    Sub van de uitgang
  Eind als
   
  '/breng handvat voor lokaal dossier ertoe om bytes te lezen
  hFile = CreateFileW (StrPtr („\ \? \“ & szLocalFile), GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0)
   
  Als hFile = INVALID_HANDLE_VALUE toen
    Schoonmaakbeurt
    Debug.Print „CreateFileW ()“ & Err.LastDllError
    Sub van de uitgang
  Eind als
  
  '// krijgt lokale dossiergrootte voor vooruitgang. Dit voorbeeld steunt
  '    slechts tot 2GB van status die vooruitgang meldt.
  dwLoFileSize = hFile GetFileSize (, dwHiFileSize)
  
  '/schrijft het gelezen lokale dossier, de bytes van het serverdossier
  
    Als hFile ReadFile (, VarPtr (Buffer (0)), BUF_SIZE, dwReadBytes, 0) toen
      Als InternetWriteFile (hInternet, VarPtr (Buffer (0)), dwReadBytes, dwWrittenBytes) toen
        'Spoor de hoeveelheid geschreven bytes en percentage.
        dwStatus = (dwStatus + dwWrittenBytes)
        dwPercent = (dwStatus/dwLoFileSize) * 100
        'Label1.Caption = dwPercent
      Eind als
    Anders
      De uitgang 
    Beëindig als
    DoEvents
  Lijn tot dwReadBytes = 0
   
  Debug.Print „Gedaan“
  '/schoonmaakbeurt
  Schoonmaakbeurt
  Wis Buffer
   
  
Beëindig Sub
 
Privé SubSchoonmaakbeurt ()
   
  Als 0 <> dan hOpen
    InternetCloseHandle hOpen
    hOpen = 0
  Beëindig als
  Als hConnect <> 0 toen
    InternetCloseHandle hConnect
    hConnect = 0
  Eind als
  Als hInternet <> 0 toen
    InternetCloseHandle hInternet
    hInternet = 0
  Eind als
  Als hFile > 0 toen
    hFile CloseHandle
    hFile = INVALID_HANDLE_VALUE
  Eind als
   
Sub van het eind
Andere oplossingen  
 
programming4us programming4us