Duda respecto a crear dll.

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Hola buenas!!!, acabo de empezar a mirar la programación en C++ y ya se me presentan algunas dudas con el AMS, y una de ellas es como se crean las funciones en la DLL para poder llamarlas desde el AMS y como se devuelve el valor al mismo.

Yo he probado una especie de "Hola Mundo" con la DLL pero no he sacado nada en claro :hypno:
El código es este:

#include "stdafx.h"
char* main(){
return "prueba";
}


Es más simple que el mecanismo de un chupete :P

También he probado creando funciones como:
char* prueba(){
return "prueba";
}


Y el resultado es el mismo, y la función se que está bien hecha porque en modo "Win32 Console" le pongo un "printf(prueba())" y funciona correctamente...

Si, se que la pregunta no puede ser más tonta pero es que son las que te salen cuando empiezas en algo :lol:

PDTA: desde el AMS la llamo así:
local salida = DLL.CallFunction("DLL.dll", "main", "", DLL_RETURN_TYPE_STRING, DLL_CALL_CDECL);
o
local salida = DLL.CallFunction("DLL.dll", "prueba", "", DLL_RETURN_TYPE_STRING, DLL_CALL_CDECL);
Gracias!!!
no pongas cdecl al final sino stdcl
Hola, tengo una horita libre y voy a hacer un pequeño tutorial para empezar en el mundo de las librerías para lua.

Primero de todo, comprender como es una libreria dll, que no es mas que parte de la propia aplicación que se coloca externamente a esta, y que puede ser llamada para ejecutar su contenido.

Hay diferentes funcionamientos, compiladores y un mundo de configuraciones que hacen que este tema sea un poco tedioso al principio.

Para comenzar, necesitamos un entorno de desarrollo, para hacerlo facil, vamos a usar DEV-C++ (5) que es libre, gratis, y utiliza el compilador mas extendido MinGW

No me errollo mas, codigo para una dll llamable en lua:

#include <windows.h>
#define DLL_EXPORT extern "C" __declspec(dllexport)

DLL_EXPORT void SayHello();
DLL_EXPORT int Addition(int arg1,int arg2);
DLL_EXPORT LPTSTR CombineString(LPTSTR arg1,LPTSTR arg2);

BOOL APIENTRY DllMain (HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
return TRUE;
}

DLL_EXPORT void SayHello()
{
MessageBox(NULL, "Hello World.. From Your First C++ Dll", "Hello..", MB_ICONINFORMATION);
}

DLL_EXPORT int Addition(int arg1,int arg2)
{
return arg1+arg2;
}

DLL_EXPORT LPTSTR CombineString(LPTSTR arg1,LPTSTR arg2)
{
LPSTR sz_return;
sz_return = lstrcat(arg1,arg2);
return sz_return;
}


Cosas a destacar: C/C++ no tiene integración nativa para gestion de dll, esta integracion viene gracias a Winapi, que es una librería muy basica y fundamental de desarrollo sobre windows, winapi, gestiona el punto de entrada de la dll como podeis ver en la funcion BOOL APIENTRY DllMain(...) esta nunca cambia ya que se requiere el punto de entrada para cargar en memoria ram la libreria.

Tras esto, vemos un pequño cambio en las funciones C corrientes, DLL_EXPORT lo cual exporta un dirctorio de nombrs de funcion asociadas a su puntero de memoria en la dll, esto es lo que sirve para que luego puedan ser llamadas por ahi con Pinvoke, lo cual hace la funcion dll.callfunction(...)

Podemos elegir exportar o no exportar funciones, por ejemplo dejar algunas para uso interno y otras pocas visibles externamente

Esta librería podria ser llamada de esta forma:
DLL.CallFunction( "AutoPlay\\Docs\\AmsDll.dll", "SayHello", "", DLL_RETURN_TYPE_LONG, DLL_CALL_CDECL);

result = DLL.CallFunction( "AutoPlay\\Docs\\AmsDll.dll", "Addition", "13,67", DLL_RETURN_TYPE_LONG, DLL_CALL_CDECL);
Dialog.Message( "Notice", "result : "..result, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); 

local Args = "\"Hello \",\"World\"";
result = DLL.CallFunction( "AutoPlay\\Docs\\AmsDll.dll", "CombineString", Args, DLL_RETURN_TYPE_STRING, DLL_CALL_CDECL);
Dialog.Message( "Notice", result, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); 
Con esto ya tenemos una primera idea sobre el uso de dlls sobre ams, pero es una solucion no muy buena ya que este es un metodo de puentear a lua para realizar las llamadas, por lo que en el proximo rato libre que tenga, os hare otra pequeña charla sobre creacion de una libreria dll para lua, la cual registre funciones en el stack de lua y puedan trabajar en conjunto, de hecho deje un breve tutorial en el foro de ams, simplemente descomprimid sobre vuestra carpeta de mingw esto:http://sourceforge.net/projects/mingw-c ... a-5.1.4-2/ lo cual contiene lua 5.1.4 en vez del 5.0.1 que publique en ese foro: http://www.indigorose.com/forums/thread ... g-C-in-Lua

Para lo que quieran aprender un poco sobre el Lua C API, visiten esta web y usen lua2c: http://doris.sourceforge.net/lua/weblua.php
y por cierto, tu dll se llama asi:
lprueba=package.loadlib("prueba.dll","prueba")
Dialog.Message('test', lprueba() )
ya que en lia 5.1 loadlib ha pasado a ser package.loadlib, o eso creo recordar...
Muchas gracias Pabloko por los dos datos ;) ahora toca experimentar hasta que reviente el PC por algún lado, que seguramente sea el Windows :lol:

PDTA: Yo uso el Microsoft Visual Studio 2010, supongo que será más menos igual.
Que tal Pabloko, esta Interesante esto del Curso. A ver cuando lo condensas en PDF, para estudiarlo un poco.
creo que esta en ello... pero con calma!!