LLAMADLLfunción_y_argumentos
(LLAMADLLfunción_y_argumentos
nombre_de_biblioteca
) DLLCALLfunción_y_argumentos
(DLLCALLfunción_y_argumentos
nombre_de_biblioteca
)
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:
tipof | Tipo Nativo | LLAMADLL Devuelve |
---|---|---|
V | void | Nada |
W | WORD, SHORT o USHORT | Devuelve los 16 bits inferiores del valor de retorno de la función como una lista de un solo elemento. |
L | DWORD, LONG o ULONG | Devuelve el valor de retorno de la función, interpretado como un entero de 32-bits, como una lista de un solo elemento. |
F | DOUBLE | Devuelve el valor de retorno de la función como una lista de un solo elemento. |
S | LPSTR | Copia 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 Nativo | Acción de LLAMADLL sobre arg# |
---|---|---|
V | void | Ignora el argumento |
W | WORD, SHORT o USHORT | Empuja los 16 bits inferiores del argumento a la pila de llamada como un valor de 32 bits. |
L | DWORD, LONG o ULONG | Empuja el valor del argumento como un entero de 32 bits a la pila de llamada. |
F | DOUBLE | Interpreta el argumento como un double y empuja el valor como un coma flotante de 64 bits a la pila de llamada. |
S | LPCSTR | Convierta 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. |
U | LPCWSTR | Convierta 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. |
B | PBYTE, PULONG, LPSTR o LPWSTR | Asigna 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.
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