LLAMADLL

Sinopsis
LLAMADLL función_y_argumentos
(LLAMADLL función_y_argumentos nombre_de_biblioteca)
DLLCALL función_y_argumentos
(DLLCALL función_y_argumentos nombre_de_biblioteca)
Descripción

Llama a una determinada función y, opcionalmente, devuelve su valor de retorno. La función debe estar exportada de una biblioteca (DLL) previamente cargada con CARGADLL.

El argumento función_y_argumentos es de la forma [tipof función tipo1 arg1 tipo2 arg2 tipo3 arg3 ...].

LLAMADLL interpreta tipof como descripción del valor de retorno de la función. El valor de retorno es analizado a una lista, como con ANALIZA. Todos los búferes que fue creado para «parámetros de retorno» son agregado al fin de esta lista y LLAMADLL devuelve la lista completa. El significado de cada tipof soportado se da en la tabla siguiente:

tipofTipo NativoLLAMADLL Devuelve
VvoidNada
WWORD, SHORT o USHORTDevuelve los 16 bits inferiores del valor de retorno de la función como una lista de un solo elemento.
LDWORD, LONG o ULONGDevuelve el valor de retorno de la función, interpretado como un entero de 32-bits, como una lista de un solo elemento.
FDOUBLEDevuelve el valor de retorno de la función como una lista de un solo elemento.
SLPSTRCopia los datos del puntero de retorno a una palabra, interpretándolos como una cadena de caracteres de la página de códigos por defecto del sistema. Después, llama GlobalFreePtr() sobre este puntero. Por fin, se analiza la cadena como con ANALIZA y devuelve la lista resultante.

función debe ser una palabra que iguala exactamente a un símbolo exportado de una biblioteca cargada. Para las funciones de Win32 que acepta un parámetro de tipo TCHAR, el símbolo exportado probablemente termina con «W» o «A», aún si no la llamaría así de C.

LLAMADLL pasa arg1 como tipo1, arg2 como tipo2 y así sucesivamente. Tengas en cuenta que la convención de llamada de Win32 «stdcall» pasa argumentos de derecha a izquierda, así que arg1 es de veras el último parámetro. LLAMADLL toma acciones distintas para cada tipo de argumento, según la tabla siguiente:

tipo#Tipo NativoAcción de LLAMADLL sobre arg#
VvoidIgnora el argumento
WWORD, SHORT o USHORTEmpuja los 16 bits inferiores del argumento a la pila de llamada como un valor de 32 bits.
LDWORD, LONG o ULONGEmpuja el valor del argumento como un entero de 32 bits a la pila de llamada.
FDOUBLEInterpreta el argumento como un double y empuja el valor como un coma flotante de 64 bits a la pila de llamada.
SLPCSTRConvierta el argumento en un búfer de caracteres ANSI según la página de códigos por defecto del sistema, añade el carácter nulo terminador y empuja su puntero a la pila de llamada.
ULPCWSTRConvierta el argumento en un búfer de caracteres anchos (16-bit), añade el carácter nulo terminador y empuja su puntero a la pila de llamada.
BPBYTE, PULONG, LPSTR o LPWSTRAsigna a un búfer cuantos bytes de memoria designado por el argumento, cuando se lo interpreta como un entero. Inicia todos los bytes del búfer a cero. Marca al búfer como una palabra entre barras verticales así que puede tener bytes que son caracteres de control. Empuja un puntero a este búfer a la pila de llamada. Después de que la función retorna, añade el búfer a la lista para devolver. Si la función devuelve void, entonces LLAMADLL crea una lista para poder devolver el búfer.

La intención de esta forma es para guardar datos binarios, bytes de 0 - 255. Si se escriben caracteres ANSI al búfer, entonces no son interpretados según la página de códigos del sistema. Cualquier carácter cuyo punto de código es más de 127 puede convertirse en otro carácter en FMSLogo. Del mismo modo, si se escriben al búfer caracteres Unicode (LPWSTR), entonces LLAMADLL los interprete como si fueran codificados en UTF-16LE (el byte bajo y el byte alto de cada WCHAR se convierten en dos caracteres, con el del byte bajo primero).

Si el argumento opcional nombre_de_biblioteca es dado, entonces LLAMADLL solamente busca a la función dentro de esa biblioteca.

LLAMADLL devuelve los argumentos de tipo «B» como palabras con el tamaño designado. Cada byte en estos búferes que la función no sobrescribe se convierte en el carácter nulo. Por lo tanto, si una función que llena un búfer con una cadena de bytes solamente usa parte del búfer, el búfer tendrá muchos caracteres nulos al fin. Una palabra creada de un tal búfer no se comporta como una palabra normal. No obstante, puedes convertirla en una palabra normal eliminando los caracteres nulos con algo así:

HAZ "bufer FILTRA [NOIGUALES? CAR 0 ? ] :bufer

LLAMADLL es solo para los usuarios experimentados que conocen las convenciones de llamada porque si no está de acuerdo la lista de argumentos con la convención de llamada, Windows responderá de forma imprevisible (incluyendo la caída de FMSLogo). LLAMADLL puede manejar un variado de funciones, aunque no todas.

Con LLAMADLL, puedes extender el alcance de FMSLogo cuando sus procedimientos no son suficientes para tu tarea. Puedes escribir tu propia biblioteca (DLL) con una interfaz compatible para llamar funciones con interfaz incompatible.

Ejemplo

El ejemplo siguiente es equivalente a la llamada en C:

MessageBox(NULL, L"¿Te gusta FMSLogo?", L"Pregunta", MB_YESNO);

Nota como se agrega un «W» al fin del nombre de «MessageBox» y como se pasa los argumentos en orden revés para conformar a la convención de stdcall.

CARGADLL "user32.dll
IGNORA LLAMADLL [L MessageBoxW L 4 U [Pregunta] U [¿Te gusta FMSLogo?] L 0]

Ve como aparece un cuadro de mensaje.

QUITADLL


SourceForge.net Logo