Bueno decidi ponerme a hacer un pequeño tuto de como crear un FTP, tratare de explicarlo lo mejor posible!

Veamos:
Lo primero que nesecitamos es una API (libreria de windows) que nos permita hacer las conexiones,el paso de archivos, y demas comandos que en un cliente de ftp (protocolo de transferencia de archivos) estan presentes.
Ustedes diran ...... y ahora? bueno para eso estoy aquiÂ

usaremos la libreria de windows llamada WININET.dll...
.. pero porque esa libreria y no otra diran ustedes?
bueno para los que recien empiezan WININET es un módulo que contiene las funciones relacionadas con el internet usadas por por las aplicaciones de windows.
ahora que ya sabemos que .dll usar, pasemos al desarrollo del programa!
lo primero que hago siempre que desarrollo un soft, es declarar las funciones de la libreria ( creo que todos hacen lo mismo no? jajaÂ

).
para eso creamos un archivo de tipo ".bas" dentro del proyecto!
veamos que funciones nos brinda WININET!
antes que nada le ponemos un nombre no?
Attribute VB_Name = "modWinInet"
fijense como lo declaran dentro del proyecto 
ahora, como debemos declarar las variables, tenemos que poner qu se declaren SI O SI!!
Option Explicit
ustedes diran y?? eso para que es? ?? jaja, bueno al igual que en el lenguaje ASP, se usa esto para que las variables se puedan usar correctamenteempezemos con las variables.....
.
Declare Function GetProcessHeap Lib "kernel32" () As Long
Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long
Public Const HEAP_ZERO_MEMORY = &H8
Public Const HEAP_GENERATE_EXCEPTIONS = &H4
y ahora que haces ghost? vos estas loco? dijiste que usemos WININET y me mandas KERNEL32??

naaa no estoy loco (puede qe un poco) , lo que hicimos ahi es inicializar la memoria a 0, dicha funcion se encuentra en esa libreria. tranquilos no me perdi!Â

Declare Sub CopyMemory1 Lib "kernel32" Alias "RtlMoveMemory" ( _
     hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Declare Sub CopyMemory2 Lib "kernel32" Alias "RtlMoveMemory" ( _
     hpvDest As Long, hpvSource As Any, ByVal cbCopy As Long)
oootraaa veezz esa libreria??? y ahora que me vas a inventar ghost? hee? jajaa,
ahi declaramos la funcion "Copymemory", que sirve para mover un grupo de Lenght bytes desde Source hasta Destination.
si todo muy lindo y "ByVal"
q me decis de eso
ByVal se utiliza para pasar parámetros a funciones por valor en lugar de por variable. (sino te quedo claro lo lamento, no preguntes tantoÂ
)Public Const MAX_PATH = 260
Public Const NO_ERROR = 0
Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_ATTRIBUTE_HIDDEN = &H2
Public Const FILE_ATTRIBUTE_SYSTEM = &H4
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
Public Const FILE_ATTRIBUTE_NORMAL = &H80
Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
Public Const FILE_ATTRIBUTE_COMPRESSED = &H800
Public Const FILE_ATTRIBUTE_OFFLINE = &H1000
una simple igualdad si tienen dudas, preguntenme !Â