RE:Variable por referencia
Internamente Visual Basic hace muchas cosas por el programador de aplicaciones que le hacen la vida más fácil, pero hay que recordar que siempre será bajo en rendimiento, por tanto, lenguajes como Delphi, C++ que son de mayor rendimiento deberás especificarle más al compilador de lo que pretendes hacer. Cualquiera que venga del mundo de VB pensará "pero bueno, para qué tanto complique" pero en un momento dado este pensamiento es de quienes nacieron montando en coche, y luego lo mandan a montar bici, cuando tú has montado bici desde el principio, sabes que es más saludable para ti, por tanto son puntos de vista diferentes y claro, el libre albedrío se presenta aquí. Pero bueno, a tu función le falta cosas como CDECL, porque es probable que la función haya sido hecha con C++, por tanto CDECL significa C Declaration. Para resumir es un modelo de memoria, prueba por si las moscas esto,
function SCardEstablishContext(dwScope:longint; pvReserved1:longint; pvReserverd2:longint; var phContext:longlong):longint; cdecl; far; external 'winscard.dll';
la palabra far quiere decir que se llame el modelo fuera de la pila.
Creo que por ahora eso es todo, no he probado lo que dices porque no tengo la dll.