Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

Ayuda con DLL

Ver el tema anterior Ver el tema siguiente Ir abajo

Ayuda con DLL

Mensaje por newold el 2018-09-04, 21:11

En RPG maker tengo un array con 2 números y un texto, usando la función ruby pack obtengo un texto que paso a la dll que debería cambiar los valores. Los dos números los puedo cambiar bien sin problemas, pero el texto no hay manera.

Necesito pasar una variable de texto en rpg maker a una función dentro de una dll en c++, cambiar el texto en la función c++ y devolver el resultado.

código en c++
Código:
// Estructura que voy a pasar desde rpg maker
struct ALGO
{
 long value1;
 long value2;
 const char*value3;
};

// Función que modifica los valores
RGSSApi void prueba(ALGO * object)
{
 object->value1 = 100;
 object->value2 += 200;
 object->value3 = (const char*)"otro texto";

}

código en el maker:
Código:
f = Win32API.new("f/MyDll.dll", "prueba", "P", "")

a = [1, 10, "Prueba2"] # variable a pasar

t = a.pack("lla*") # convertir el array a una cadena

# Muestra el valor de a, el valor de t, y el valor de a otra vez desempacando t
p a, t, t.unpack("lla*")

f.call(t) # llamar a la función de c++ que modifica los valores

# Muestra el valor de a, el valor de t, y el valor de a otra vez desempacando t
# Ahora a[0] = 100, a[1] = 210, a[2] está mal
p a, t, t.unpack("lla*")

exit


¿Como podría modificar el texto en mi función c++?
avatar
newold
Principiante
Principiante

0/3

Créditos 1276

Gracias : 137

Volver arriba Ir abajo

Re: Ayuda con DLL

Mensaje por Wecoc el 2018-09-04, 22:39

Según veo la parte de RGSS está toda correcta, así que el problema está en la librería.

Cuando dices a[2] está mal, ¿quieres decir que no se actualiza, o que cambia por algo raro?
¿No será que [line]const char*value3;[/line] debería ser simplemente [line]char *value3;[/line]?
En la parte de value3 igual, no veo ninguna necesidad de usar const en ninguno de estos casos

Mira esto de ejemplo, creo que puede ayudarte: RPG VX Ace SDK
Si no siempre puedes buscar otros ejemplos, aquí hay algunos (primera página) pero hay que tener en cuenta que Heretic estaba aprendiendo.
avatar
Wecoc
Administrador
Administrador



Créditos 12310

Gracias : 654

Volver arriba Ir abajo

Re: Ayuda con DLL

Mensaje por orochii el 2018-09-05, 01:20

Con un string es igual que con un objeto de otro tipo, se le pasa un puntero, que es como lo estás poniendo. El asunto es que tienes que pasarle el tamaño del buffer también, y supongo que iterar hasta cubrir el tamaño del string.

Por ejemplo, si el string mide 60bytes, pasarle un 60 junto al puntero a la dirección de memoria. Básicamente tendrías que pasarle un parámetro más. Y de ahí entonces en C++ sería algo tipo:
Código:
const char[] text = "no se";
for(int i=0; i < bufferLength; i++) {
  if (i < strlen(text)) {
    *((object->value3)+i) = text[i];
  }else{
    *((object->value3)+i) = ' '; //por decir algo, para luego pasarlo por trim o algo así
  }
}

Esto que puse debe estar mal xD, pero la idea es ir iterando por el string.

EDIT: Lo otro es, para no pasarle un string de tamaño variable, pasar una dirección a un buffer. Entonces haces algo así:
Código:
text = "\0" * 1024
@ini.call(@culture, id, '', text, 1024, @filename)
(Ese código es la llamada de un script de Localization de KK20, decía 256 pero necesitaba más espacio xD).
Haces un string vacío XD de un tamaño X, y luego lo pasas junto a ese tamaño X, así no hay que preguntarse si el texto nuevo cabe.
avatar
orochii
Reportero

0/3

Créditos 7813

Gracias : 470

Volver arriba Ir abajo

Re: Ayuda con DLL

Mensaje por newold el 2018-09-05, 09:16

Gracias por la ayuda. KK20 me ha contado como hacerlo y básicamente es la solución de orochii. En el pack de ruby tengo que usar 'p' para el texto, el texto lo tengo que tener formateado con un tamaño definido, y en la librería c++ lo cambio usando el comando memcpy.

Con esto puedo hacer ahora lo que quería, recrear el sistema de doodads pero usando formularios externos escritos en c. A ver que sale de aquí :D
avatar
newold
Principiante
Principiante

0/3

Créditos 1276

Gracias : 137

Volver arriba Ir abajo

Re: Ayuda con DLL

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.