
fabrice91
|
Salut, J'ai un problème qui ressemble à celui de ce sujet : j'ai créé une dll (à partir de fonction qui marchent sans problème) qui compile sans aucune erreur, et lorsque je l'utilise elle fait planter mon .exe. Je suis sur de mon .exe, et les fonctions marche parfaitement (je les ai essayé avant dans un projet sans dll). La dll exporte en __declspec , j'ai essayé avec __cdecl, mais lors de la compilation j'ai eu : error: expected initializer before "OpenCOM" j'ai essayé __cdeclspec, mais làerror: `dllimport' was not declared in this scope. (je suis sous code::block) Que faire...
Merci d'avance pour l'aide que vous pourrez (j'espère) m'apporter.
Voila mon header : #ifndef __dllFAB_pointeur_H__ #define __dllFAB_pointeur_H__ #define DllImport __declspec(dllimport)
#include <windows.h>
BOOL DllImport OpenCOM (HANDLE *g_hCOM, int nId); BOOL DllImport CloseCOM (HANDLE *g_hCOM); BOOL DllImport ReadCOM (HANDLE *g_hCOM, void* buffer, int nBytesToRead, int* pBytesRead); BOOL DllImport WriteCOM (HANDLE *g_hCOM, void* buffer, int nBytesToWrite, int* pBytesWritten);
#endif
et mon code :
#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <conio.h> #include "dllFAB_pointeur.h"
/*============================================================================= Définition de constantes =============================================================================*/ #define RX_SIZE 4096 /* taille tampon d'entrée */ #define TX_SIZE 4096 /* taille tampon de sortie */ #define MAX_WAIT_READ 5000 /* temps max d'attente pour lecture (en ms) */ #define DllExport __declspec(dllexport)
/****************************************************************************** OpenCOM : ouverture et configuration du port COM. entrée : nId : Id du port COM à ouvrir. retour : vrai si l'opération a réussi, faux sinon. ******************************************************************************/ BOOL DllExport OpenCOM(HANDLE *g_hCOM, int nId) { /* variables locales */ char szCOM[16]; /* Délais d'attente sur le port COM */ COMMTIMEOUTS g_cto = { MAX_WAIT_READ, /* ReadIntervalTimeOut */ 0, /* ReadTotalTimeOutMultiplier */ MAX_WAIT_READ, /* ReadTotalTimeOutConstant */ 0, /* WriteTotalTimeOutMultiplier */ 0 /* WriteTotalTimeOutConstant */ };
/* Configuration du port COM */ DCB g_dcb = { sizeof(DCB), /* DCBlength */ 9600, /* BaudRate */ TRUE, /* fBinary */ FALSE, /* fParity */ FALSE, /* fOutxCtsFlow */ FALSE, /* fOutxDsrFlow */ DTR_CONTROL_ENABLE, /* fDtrControl */ FALSE, /* fDsrSensitivity */ FALSE, /* fTXContinueOnXoff */ FALSE, /* fOutX */ FALSE, /* fInX */ FALSE, /* fErrorChar */ FALSE, /* fNull */ RTS_CONTROL_ENABLE, /* fRtsControl */ FALSE, /* fAbortOnError */ 0, /* fDummy2 */ 0, /* wReserved */ 0x100, /* XonLim */ 0x100, /* XoffLim */ 8, /* ByteSize */ NOPARITY, /* Parity */ ONESTOPBIT, /* StopBits */ 0x11, /* XonChar */ 0x13, /* XoffChar */ '?', /* ErrorChar */ 0x1A, /* EofChar */ 0x10 /* EvtChar */ };
/* construction du nom du port, tentative d'ouverture */ sprintf(szCOM, "COM%d", nId); *g_hCOM = (HANDLE)CreateFile(szCOM, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL); if(*g_hCOM == INVALID_HANDLE_VALUE) { printf("Erreur lors de l'ouverture du port COM%d", nId); return FALSE; }
/* affectation taille des tampons d'émission et de réception */ SetupComm(*g_hCOM, RX_SIZE, TX_SIZE); /* configuration du port COM */ if(!SetCommTimeouts(*g_hCOM, &g_cto) || !SetCommState(*g_hCOM, &g_dcb)) { printf("Erreur lors de la configuration du port COM%d", nId); CloseHandle(*g_hCOM); return FALSE; }
/* on vide les tampons d'émission et de réception, mise à 1 DTR */ PurgeComm(*g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT); EscapeCommFunction(*g_hCOM, SETDTR); return TRUE; }
/****************************************************************************** CloseCOM : fermeture du port COM. retour : vrai si l'opération a réussi, faux sinon. ******************************************************************************/ BOOL DllExport CloseCOM(HANDLE *g_hCOM) { /* fermeture du port COM */ CloseHandle(*g_hCOM); return TRUE; }
/****************************************************************************** ReadCOM : lecture de données sur le port COM. entrée : buffer : buffer où mettre les données lues. nBytesToRead : nombre max d'octets à lire. pBytesRead : variable qui va recevoir le nombre d'octets lus. retour : vrai si l'opération a réussi, faux sinon. ------------------------------------------------------------------------------- Remarques : - la constante MAX_WAIT_READ utilisée dans la structure COMMTIMEOUTS permet de limiter le temps d'attente si aucun caractères n'est présent dans le tampon d'entrée. - la fonction peut donc retourner vrai sans avoir lu de données. ******************************************************************************/ BOOL DllExport ReadCOM(HANDLE *g_hCOM, void* buffer, int nBytesToRead, int* pBytesRead) { return ReadFile(*g_hCOM, buffer, nBytesToRead, (DWORD*)pBytesRead, NULL); }
/****************************************************************************** WriteCOM : envoi de données sur le port COM. entrée : buffer : buffer avec les données à envoyer. nBytesToWrite : nombre d'octets à envoyer. pBytesWritten : variable qui va recevoir le nombre d'octets envoyés. retour : vrai si l'opération a réussi, faux sinon. ******************************************************************************/ BOOL DllExport WriteCOM(HANDLE *g_hCOM, void* buffer, int nBytesToWrite, int* pBytesWritten) { /* écriture sur le port */ return WriteFile(*g_hCOM, buffer, nBytesToWrite, (DWORD*)pBytesWritten, NULL);
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { switch (reason) { case DLL_PROCESS_ATTACH: break;
case DLL_PROCESS_DETACH: break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break; }
/* Returns TRUE on success, FALSE on failure */ return TRUE; }
PS: les fonctions doivent permettre de dialoguer avec un port COM (l'ouvrir, ecrire dessus, le lire et le fermer)
|