SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: xouba en Miércoles 6 de Julio de 2011, 01:23

Título: Exportar funciones desde c++
Publicado por: xouba en Miércoles 6 de Julio de 2011, 01:23
Hola, estoy empezando a programar desde el entorno visual studio 2010. Mi duda es la siguiente:
Teniendo un código en c++ me gustaria utilizarlo como un dll, para ello creo un proyecto en visual c++ y como biblioteca de clases, entonces, entiendo que el código debe ubicarse en el archivo .cpp y si quiero exportar funciones a otro proyecto en otro lenguaje por ejemplo c# ¿Qué debería hacer? ¿Poner los enunciados de las funciones en el archivo .h?
Muchas gracias y perdón si repito post pero navengando por el foro no solucioné mis dudas.
Título: Re: Exportar funciones desde c++
Publicado por: ProfesorX en Miércoles 6 de Julio de 2011, 02:59
Hola xouba, bienvenido al foro.

Bueno, para aclarar un poco tu duda, te dire que si, lo mas recomendables es colocar en el archivo .h el encabezado de tus funciones/clases, y la definicion de tus funciones/clases en otro archivo.

Te dire sin embargo que es posible colocar todo el codigo de tu clase y no solo los encabezados en un archivo .h aunque no se recomienda.

Pero deberas ademas utilizar las directivas dllexport/dllimport segun desees exportar(archivo dll) o importar(archivo exe) el codigo.

No tengo un ejemplo a la mano en español de como debes hacerlo exactamente, pero buscando en google puedes encontrar mas informacion. Prueba buscando dllexport.

Te dejo algunos enlaces (en ingles) con mas informacion, o busca mas por tu cuenta ;)

Exportar DLL (http://msdn.microsoft.com/en-us/library/a90k134d%28v=vs.80%29.aspx)

Exportar DLL para usarla en C (http://msdn.microsoft.com/en-us/library/wf2w9f6x%28v=VS.80%29.aspx)

Importar DLL (http://msdn.microsoft.com/en-us/library/8fskxacy%28v=vs.80%29.aspx)

Curso rapido de como exportar a una DLL (http://home.hiwaay.net/~georgech/WhitePapers/Exporting/Exp.htm)

Saludos :)
Título: Re: Exportar funciones desde c++
Publicado por: xouba en Domingo 10 de Julio de 2011, 16:57
Muchas gracias por tu respuesta. He estado probando la utilización de dllimport y finalmente me funciona de la siguiente manera:

Código: C++
  1. // prueba.h
  2. #pragma once
  3.  
  4. using namespace System;
  5.  
  6.     extern "C" __declspec(dllexport) int __cdecl suma();
  7.  
  8.     class Clase1
  9.     {
  10.     public: 
  11.         static int suma();
  12.     };
  13.  
  14.  

Código: C++
  1. // Archivo DLL principal.
  2.  
  3. #include "stdafx.h"
  4. #include "prueba.h"
  5.  
  6. int suma(){return Clase1::suma();};
  7. int Clase1::suma()
  8. {
  9.     return 8;
  10. }
  11.  

Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Runtime.InteropServices;
  10.  
  11. namespace WindowsFormsApplication1
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         public Form1()
  16.         {
  17.             InitializeComponent();
  18.         }
  19.         [DllImport("prueba.dll"/*, EntryPoint = "suma", CharSet = CharSet.Unicode*/)]
  20.         public static extern int suma();
  21.         private void button1_Click(object sender, EventArgs e)
  22.         {
  23.             listBox1.Items.Add("Suma es " + suma());
  24.         }
  25.     }
  26. }
  27.  

Es un código muy sencillito donde desde mi interfaz en c# importo una función de mi biblioteca en c++ para utilizarla al pulsar el botón. Me gustaría saber si esta forma de relacionar mis 2 proyectos es "eficiente" o podría mejorarlo, para ya poder empezar a complicar la cosa. Muchas gracias de antemano.