C/Visual C - Crear una DLL y llamarla en otro lenguaje

 
Vista:
sin imagen de perfil
Val: 40
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Crear una DLL y llamarla en otro lenguaje

Publicado por Meta (22 intervenciones) el 27/07/2018 10:03:45
Hola:

Quiero hacer esto desce cero con Visual studio Community 2017. Creo una dll en Win32 C++. En él solo hay dos cosas, una fórmula matemática y un mensaje. Por ejemplo.

Fórmula matemática:

2 + 3

Mensaje:

Hola. Soy una DLL Win32.

Una vez creada una dll en C++ Win32 con lo indicado arriba, quiero ahora crear otro proyecto con Windows Form hecho bajo el lenguaje C#. En el formulario tiene incluido un label1 para mostrar el mensaje y otro label2 para mostrar el resultado de la suma.

Cualquier cosa que se entienda, lo repito de otra manera. Lo hice así tan sencillo para aprender de una vez y rápido como hacerlo.


Código C++
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// $nombredeproyecto$.cpp: define las funciones exportadas de la aplicación DLL.
//
 
#include "stdafx.h"
 
extern "C" {
	__declspec(dllexport)  int WINAPI Suma(int, int);
	__declspec(dllexport) LPTSTR WINAPI Mensaje();
}
 
BOOL APIENTRY DllMain(HMODULE hModule,
	DWORD  ul_reason_for_call,
	LPVOID lpReserved
)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}
 
int WINAPI Suma(int a, int b) { return a + b; }
LPTSTR WINAPI Mensaje() { return TEXT("Hola. Soy una DLL Win32."); }

En la última línea donde pone TEXT pone error indicado abajo.

1
LPTSTR WINAPI Mensaje() { return TEXT("Hola. Soy una DLL Win32."); }

Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
Error (activo) E0120 el tipo de valor devuelto no coincide con el tipo de función pepe c:\Users\Usuario\Documents\Visual Studio 2017\Projects\pepe\pepe\pepe.cpp 28

En el mismo proyecto de la dll creo la interfaz C#:

Código C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Runtime.InteropServices; // No olvidar.
using System.Windows.Forms;
 
namespace Prueba_dll_cs_01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = Marshal.PtrToStringAuto(PEPE.Mensaje());
            label2.Text = PEPE.Suma(1764, -764).ToString();
        }
    }
 
    internal class PEPE
    {
        [DllImport("pepe.dll", EntryPoint = "_Suma@8")]
        extern static public int Suma(int a, int b);
        [DllImport("pepe.dll", EntryPoint = "_Mensaje@0")]
        extern static public IntPtr Mensaje();
    }
}

Como dije antes, el problema está en el TEXT que dice el error: el tipo de valor devuelto no coincide con el tipo de función.

¿Alguna idea?

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Crear una DLL y llamarla en otro lenguaje

Publicado por Tom (619 intervenciones) el 27/07/2018 11:53:53
Probablemente debas retornar LPCSTR y no LPTSTR.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 40
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Crear una DLL y llamarla en otro lenguaje

Publicado por Meta (22 intervenciones) el 27/07/2018 15:07:00
Lo he hecho y ocurre lo mismo, también cambiado por char*.

1297801
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Crear una DLL y llamarla en otro lenguaje

Publicado por Nacho (76 intervenciones) el 27/08/2018 21:50:07
Si a la función le pones que devuelva un LPTSTR tendrás que decirle que el texto es un LPTSTR, y no pasarlo por la macro TEXT que no te hace un LPTSTR. Y si los datos son de otro tipo te dará ese error.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 40
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Crear una DLL y llamarla en otro lenguaje

Publicado por Meta (22 intervenciones) el 20/01/2019 21:32:32
Hola Nacho:

¿Puedes poner un ejemplo del LPTSRT?

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Crear una DLL y llamarla en otro lenguaje

Publicado por Nacho (76 intervenciones) el 10/02/2019 17:01:41
¿Todavía estás con eso?

Si la función se define como LPTSTR WINAPI Mensaje() lo que devuelva el return tiene que ser algo compatible con LPTSTR, Que la macro TEXT devuelva algo así depende de lo que tengas definido en las propiedades del proyecto.

Si la función es LPTSTR WINAPI Mensaje() el mensaje tiene que ser un LPTSTR, o sea, LPTSTR WINAPI Mensaje() { return LPTSTR("Hola. Soy una DLL Win32."); } o LPTSTR WINAPI Mensaje() { return LPTSTR(L"Hola. Soy una DLL Win32."); } si es unicode.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 40
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Crear una DLL y llamarla en otro lenguaje

Publicado por Meta (22 intervenciones) el 10/02/2019 21:05:39
Buenas:

Dejé un tiempo esto porque ahora estoy trabajando. Ya que a veces por las tardes tengo libre, me dedico ahora hacer lo que nunca he logrado. Ahora que tengo tiempo, estoy en este. Se que caigo pesado, pero soy perseverante en estas cosas.

Dejo el proyecto completo en la descarga.

A pesar de usar estos códigos que me haz indicado y en el cual estoy agradecido, sigo con problemas.

1
2
3
LPTSTR WINAPI Mensaje() { return LPTSTR("Hola. Soy una DLL Win32."); }
 
LPTSTR WINAPI Mensaje() { return LPTSTR(L"Hola. Soy una DLL Win32."); }

capturacccc-2000075

Como cuesta hacer esto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Crear una DLL y llamarla en otro lenguaje

Publicado por Nacho (76 intervenciones) el 10/02/2019 21:51:52
El error de linkado 2005 se produce cuando se encuentra el linkador dos funciones declaradas con el mismo nombre. En el código usas una función DllMain y además usas las librerías MFC, que usan otra función DllMain. Seguramente no sepas por qué usas las MFC en la dll, pero si quitas la función DllMain en tu código ya no sale ese error. Quitar tu DllMain es una solución, aunque no la mejor.

Una dll necesita un archivo .def, y en las opciones del proyecto le tienes puesto un pepe.def, pero en el directorio de los fuentes no está ese archivo.

https://docs.microsoft.com/es-es/cpp/build/exporting-from-a-dll-using-def-files?view=vs-2017
Ahí tienes lo que escribir en un archivo .def.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 40
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Crear una DLL y llamarla en otro lenguaje

Publicado por Meta (22 intervenciones) el 10/02/2019 22:31:39
Buenas noches:

Esto me parece mucho para mi.

¿Sabes paso a paso qué hacer para acabar de funcionar de una vez?

Haz pupesto el enlace, aún así pezco. :(

Si en las configuraciones hay que hacer algo, indica el que.

Muchas gracias por todo. ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Crear una DLL y llamarla en otro lenguaje

Publicado por Nacho (76 intervenciones) el 11/02/2019 10:07:51
Casi nada.

Quita el DllMain del archivo pepe.cpp.

Pon esto en un archivo de texto llamado pepe.def y ponlo donde están los cpp.
LIBRARY pepe
EXPORTS
Suma
Mensaje

Si una solución tiene dos proyectos tienes que decirle cuál se ejecuta antes. Botón derecho en Solución pepe del explorador de soluciones, abajo en las propiedades, si en el proyecto de inicio tienes seleccionado proyecto de inicio único tienes que decirle el proyecto que tiene que ejecutarse, que es prueba_dll.

Y tienes que poner la dll donde esté el prueba_dll.exe
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 40
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Crear una DLL y llamarla en otro lenguaje

Publicado por Meta (22 intervenciones) el 11/02/2019 18:11:51
Hola:

El DllMain será este. Lo borro.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
BOOL APIENTRY DllMain(HMODULE hModule,
	DWORD  ul_reason_for_call,
	LPVOID lpReserved
)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
})

captufdgfdgfdgra-2000291

Luego lo puse la dll pepe.dll aquí.
dos-2000292

Establecere como proyecto de inicio el Prueba_dll_cs_01 y al compilar con F5, me sale en Chino pero funciona por fin.

cuatro-2000294

Aunque ponga en las propiedades del Form languaje en español (España), sale en Chino. Que cosa más rara y eso que tengo Windows en español pero bien español.

Muchísimas gracias por todo. Sigo resolviendo eso del Chino, queno entiendo ni papa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Crear una DLL y llamarla en otro lenguaje

Publicado por Nacho (76 intervenciones) el 11/02/2019 18:57:44
Te sale en chino porque el proyecto está en unicode y a la dll le has dicho que el tecto es ascii, Falta la L.

Ya ves lo bueno que es la programación para aprender idiomas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 40
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Crear una DLL y llamarla en otro lenguaje

Publicado por Meta (22 intervenciones) el 11/02/2019 21:11:02
Buenas:

Lo tengo en:
1
LPTSTR WINAPI Mensaje() { return LPTSTR(L"Hola. Soy una DLL Win32."); }

Juegos de carácteres es:
Utilizar juego de caracteres Unicode.

Por lo que se ve, tiene que ser otra cosa.

Saludos.

Edito:

Falsa alarma, hice loq ue dices, pero me había olvidado volver a cambiar la dll a su carpeta con su .exe.

caprrttttt-2000365

Haré un mini tutorial paso a paso en PDF para que no se me olvide nunca todo esto.

Muchas gracias por la ayuda.

Que tengas buen día y salud. ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 40
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Crear una DLL y llamarla en otro lenguaje

Publicado por Meta (22 intervenciones) el 16/02/2019 10:40:37
Hola:

Les dejo un mini tutorial rápido en PDF por si alguien lo necesita.

Ver tutorial.

Saludos.

PD: Gracias a los compañeros del foro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar