Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

viernes, 2 de septiembre de 2016

Cómo evitar que C++ decore los nombres de las funciones de una dll

Agradezco la ayuda a:
http://stackoverflow.com/q/2804893
http://stackoverflow.com/q/1467144

Mi caso era que estaba compilando una dll en c++ con Visual Studio Express 2013 y encontré que, al intentar invocarla desde otra aplicación, el compilador decoraba los nombres de las funciones.
Para evitarlo, se deben declarar las funciones con extern "C":

En el archivo  .h:

extern "C" __declspec (dllexport) long SomeFunction(int param);

Y en el archivo .cpp respectivo:

extern "C" 
__declspec (dllexport) long SomeFunction(int param)
{
    return _somethingIwantToDo(param);
}


si se está depurando, es mejor dejar la opción de "Generar Información de Depuración" en "Si" o el depurador empezará a protestar:

Esto es mejor dejarlo en "Si".

Al colocar  extern "C" el compilador ya no decora los nombres de las funciones aunque la convención de llamada sea stdcall o cdecl:

 
Eso sí, la convención de llamada de la dll y la aplicación que la invoca debe ser la misma, o el compilador arrojará el error LNK2019 y de paso el LNK1120:


Cómo crear una ventana modal que envíe datos ingresados por el usuario en Java Swing

Agradezco la ayuda a:
http://stackoverflow.com/a/28461883
http://stackoverflow.com/a/4089370

En Netbeans, para poder crear una ventana modal para nuestra aplicación de Swing, se debe crear un nuevo JFrame Form, y en la línea donde se declara la clase:

public class JModalFrame extends javax.swing.JFrame

cambiarla por:

public class JModalFrame extends javax.swing.JDialog

y en el constructor se debe poner:

setModal(true);

Luego de añadir un área de texto, un checkbox y un botón a la ventana modal, el código para poder retornar valores desde esta ventana es:

    Object[] thoseValues;
   
    public Object[] showDialog()
    {
        return thoseValues;
    }
   
    public JModalFrame()
    {
        setModal(true);
        thoseValues = new Object[2];
        initComponents();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)                                        
    {                                            
        thoseValues[0] = jCheckBox1.isSelected();
        thoseValues[1] = jTextArea1.getText();
       
        setModal(false);
        this.setVisible(false);
    }                                       
    


Para abrir la ventana modal, se debe añadir el siguiente código en la ventana principal (en mi caso, es la ventana que está declarada como la clase main en las propiedades del proyecto en Netbeans):

    JModalFrame jMod = new JModalFrame();
    jMod.setVisible(true);
    Object[] thosevalues = jMod.showDialog();

    jMod.dispose();


Se pueden recibir cualquier tipo de valores, yo he elegido un array de objetos.

El proyecto de Netbenas se puede descargar de aquí. Corre en Java 8.

Si se desea que la ventana modal aparezca en la barra de tareas se debe añadir el siugiente código en su constructor:

// http://stackoverflow.com/a/14261194
super(null, java.awt.Dialog.ModalityType.TOOLKIT_MODAL);