Bonjour,
Pour un projet j'ai besoin d'écrire une DLL pour utiliser avec Labview.
Le but étant de commander un microcontrôleur PIC24 (Microchip) en USB.
Je développe la DLL sous Visual Studio 8.
Labview est en version student 2011.
OS : Windows 7 64 bits.
Pour le moment dans la DLL j'ai une fonction qui écrit une valeur de 32 bits et une autre qui lit cette valeur en utilisant "return".
Cela fonctionne très bien (j'allume une LED en fonction de la valeur et je relis correctement la valeur).
Là où ça se complique, c'est que dans la vraie utilisation j'ai besoin d'utiliser le "return" pour le retour d'erreur, et j'ai 2 variables 32 bits à retourner.
Dans un premier temps je pensais en traiter qu'une comme précédemment pour le debug. Pour cela je pensais donc faire passer la variable par pointeur en tant qu'arguments de ma fonction, mais Labview étant une merde sans nom, j'ai des soucis de type qui m'empêchent de faire ce que je veux aussi simplement...
Voici ce que j'ai dans ma DLL pour la réception de la valeur 32 bits :
Je sais que le "*ledValue = (unsigned long*)(receive_buf);" ne marche pas mais c'est pour illustrer ce que je veux faire.Code:__declspec(dllexport) short __cdecl GetLedValue (unsigned long * ledValue) { send_buf[0] = GET_LED_VAL; // 0x30 : commande envoyée au µControleur send_buf[1] = STOP_BYTE; // '#' : caractère de terminaison if (usb_interrupt_write(dev, EP1_OUT, send_buf, 2, 5000)>0) { if (usb_interrupt_read(dev, EP1_IN, receive_buf, 64, 5000)>0) { *ledValue = (unsigned long*)(receive_buf); return 0; } } return 0; }
Dans Labview je veux importer la DLL et définir ledValue comme SORTIE pour l'afficher sur un indicateur.
à savoir que lorsque j'utilise "return" ça fonctionne :
Merci beaucoupCode:__declspec(dllexport) unsigned long __cdecl GetLedValue (void) { send_buf[0] = GET_LED_VAL; // 0x30 : commande envoyée au µControleur send_buf[1] = STOP_BYTE; // '#' : caractère de terminaison unsigned long ledValue=0; if (usb_interrupt_write(dev, EP1_OUT, send_buf, 2, 5000)>0) { if (usb_interrupt_read(dev, EP1_IN, receive_buf, 64, 5000)>0) { ledValue = atol(receive_buf); return ledValue; } } return 0; }
-----