CitarByVal y Byref esta explicado de alguna manera ante los procesos y funciones personalisados (en la liga y todos han ido directo a este punto mas no al real problema de este hilo, las apis.), es decir, las que creamos o las de vb6 mas no a las APIS, asi que aqui te dejo una explicacion ante esto.:aja ahi esta el punto, porque si el pasar ByVal a una api fuera nomas para "evitar que la funcion sobreescriba la variable pasada" pues en algunos casos donde iria ByVal supongo que cualquiera de las 2 formas seria valida no?, pues un caso:
suponiendo que quiero usar MessageBox
Código (vb) [Seleccionar]
Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
y en el parametro wType (icono a mostrar) NO me interesa si sobreescribe o no la variable asi que lo paso como ByRef:
Código (vb) [Seleccionar]
Option Explicit
private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByRef wType As Long) As Long
Private Sub Command1_Click()
Dim Icono As Long
Icono = 64
Call MessageBox(Form1.hwnd, "Ejemplo", "xD", Icono)
MsgBox Icono 'muestra el valor a ver si sobreescribio la variable
End Sub
pues al ejecutar no sale el "MessageBox", y el msgbox muestra "64" , pues en este caso la API no sobreescribio la variable y tampoco mostro el mensaje, este tipo de cosas es que generan dudas, supongo que aqui tambien tienne que ver en si la API porque no sabemos como tratara o que hace con los datos o referencia que le pasamos.