es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué mi programa se cierra al llamar a Printf y no funciona a través de LuaJIT FFI?

He estado intentando cargar una DLL muy simple a través de la biblioteca LuaJIT FFI, pero cuando se ejecuta mi código, el programa se pausa durante un segundo y luego se cierra sin mostrar ningún mensaje de error a mitad de camino tan pronto como intenta ejecutar printf.

El código de mi DLL:

#include <windows.h>
#include <stdio.h>

__declspec(dllexport) int getnumber(){
    return 4000;
}

__declspec(dllexport) void doprintf(){
    printf("¡Hola desde printf!");
}

__declspec(dllexport) const char* returnstring(const char*source){
    return source;
}

int main()
{

}

Mi main.lua:

print('¡Hola desde lua!') --> ¡Hola desde lua!
local ffi = require("ffi")
ffi.cdef[[
int getnumber();
void doprintf();
const char* returnstring(const char*source);
]]
clib = ffi.load("mi-dll")

print('librerías cargadas.') --> librerías cargadas.
print(ffi.string(clib.returnstring('cadena de prueba'))) --> cadena de prueba
print(clib.getnumber() - 1)  --> 3999
print(clib.doprintf())  --> ¡Hola desde printf!
print('¡hecho!') --> ¡hecho!

Lo que sucede cuando lo ejecuto:

“`
C:\Users\DPS2004\OneDrive\Documents\ffitest>ls
main.lua my-dll.dll

C:\Users\DPS2004\OneDrive\Documents\ffitest>luajit main.lua
¡Hola desde lua!
librerías cargadas.
cadena de prueba
3999

C:\Users\DPS2004\OneDrive\Documents\ffitest>
“`</stdio.h></windows.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El programa se detiene durante un segundo y luego se cierra sin mostrar ningún mensaje de error a mitad de camino cuando intenta ejecutar printf. Esto podría ser porque printf es una función en búfer y requiere vaciar la secuencia antes de que el programa termine. Esto se podría hacer utilizando fflush(stdout) después de la declaración printf en el código DLL. Sin esto, es posible que el programa termine antes de que se imprima la salida, lo que causa el comportamiento observado.

Comments are closed.