|
Re: PB d'utilisation d'une DLL |
|
---|---|---|
Animateur WDF
Inscrit:
19/01/2004 13:48 De www.sigmasys.fr
Post(s): 988
|
Bonjour,
Oui celà devrait fonctionner mais il faut que les paramètres soit du même type que en c++. Exemple : un "int" sera un "entier sur 2 octets" Bon dév., Totof
Contribution le : 22/05/2007 14:48
|
|
_________________
[ Totof(Christophe LOGEL) réalise des développements spécifiques WinDev (Mon annonce wdforge), http://www.sigmasys.fr] |
||
|
Re: PB d'utilisation d'une DLL |
|
---|---|---|
Animateur WDF
Inscrit:
19/01/2004 13:48 De www.sigmasys.fr
Post(s): 988
|
Un exemple de code serait utile.
Merci. Bon dév., Totof
Contribution le : 22/05/2007 16:47
|
|
_________________
[ Totof(Christophe LOGEL) réalise des développements spécifiques WinDev (Mon annonce wdforge), http://www.sigmasys.fr] |
||
|
Re: PB d'utilisation d'une DLL |
|
---|---|---|
Stagiaire WDF
Inscrit:
14/05/2007 14:53 Post(s): 21
|
D'accord, je te donne tout d'abord le code WD d'appel de la DLL.
Code_retour est un entier hInst est un entier hInst = ChargeDLL("C:\Dev-Cpp\UtilitaireBCP.dll") SI hInst = 0 ALORS Erreur("Erreur lors du chargement") SINON Code_retour= AppelDLL32("UtilitaireBCP.dll","exportBCP@40","DSN","Serveur","base","user","password","C:\\Fichier_SAV\\SAV\\export.txt","C:\\Fichier_SAV\\SAV\\error.txt","SELECT * FROM table","","") SI Code_retour<0 ALORS Erreur("Erreur du BCP",Code_retour,ErreurInfo()) SINON Info("BCP réussie") FIN DéchargeDLL(hInst) FIN FinProgramme() AppelDLL32 et API donne le même résultat. Voici une partie du code de la DLL. #include "UtilitaireBCP.h" #include <stdlib.h> #include <stdio.h> #include <windows.h> #include <sql.h> #include <sqlext.h> #include <odbcss.h> #include <odbcinst.h> #include <string.h> 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; } int WINAPI __stdcall exportBCP(char* DSN,char* server,char* database,char* user,char* password,char* exportFile,char* errorFile,char* request,char* separator,char* endOfLine){ SQLHENV env; SQLHDBC dbc; RETCODE retcode; DBINT nRowsProcessed; // Résultat de la configuration des sources de données ODBC bool resultat; char* temp2; char* temp; int mlen; temp=new char[500]; temp2=new char[100]; //Construction de la chaine de création de la source de données sprintf(temp,"DSN=%s* Server=%s* Database=%s* Trusted_Connection=No*",DSN,server,database); mlen = strlen(temp); for (int i=0; i<mlen; i++) { if (temp[i] == '*') temp[i] = '\0'; } //Création d'une source de données ODBC resultat=SQLConfigDataSource(NULL,ODBC_ADD_DSN,"SQL Server",(LPCSTR)temp); if(resultat==true){ //printf("Creation DSN reussie\n"); } else{ //printf("Echec de la creation DSN\n"); return -1; } //Description du Handle d'environnement retcode = SQLAllocHandle(SQL_HANDLE_ENV,NULL,&env); if (retcode==SQL_SUCCESS || retcode==SQL_SUCCESS_WITH_INFO){ /* Set the ODBC version environment attribute */ retcode = SQLSetEnvAttr(env,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER); //Description du Handle de connexion retcode = SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc ); if (retcode==SQL_SUCCESS || retcode==SQL_SUCCESS_WITH_INFO){ retcode = SQLSetConnectAttr(dbc, SQL_COPT_SS_BCP,(SQLPOINTER)SQL_BCP_ON ,SQL_IS_INTEGER); //Connexion à une base de données SQL retcode = SQLConnect(dbc,(SQLCHAR*)DSN,SQL_NTS,(SQLCHAR*)user,SQL_NTS,(SQLCHAR*)password,SQL_NTS); if (retcode==SQL_SUCCESS || retcode==SQL_SUCCESS_WITH_INFO){ //printf( "Successfully connected\n" ); SQLDisconnect(dbc); } else { return -2; } } //Libération mémoire du Handle de connexion SQLFreeHandle( SQL_HANDLE_DBC, dbc ); } //Libération mémoire du Handle d'environnement SQLFreeHandle( SQL_HANDLE_ENV, env ); sprintf(temp2,"DSN=%s*",DSN); mlen = strlen(temp2); for (int i=0; i<mlen; i++) { if (temp2[i] == '*') temp2[i] = '\0'; } //Suppression de la source de données ODBC resultat=SQLConfigDataSource(NULL,ODBC_REMOVE_DSN,"SQL Server",(LPSTR) temp2); if(resultat==true){ //printf("Suppression DSN reussie\n"); } else{ return -7; //printf("Echec de la suppression DSN\n"); } return 0; } Voilà, il y a tout ce qu'il faut pour simuler le comportement. Il faut juste recréer la DLL. Donc réécrire un fichier header de dll et la recompilée pour avoir le fichier. L'erreur s'effectue sur l'instruction SQLConnect. Merci de votre aide. Cordialement, Nicolas.
Contribution le : 23/05/2007 08:45
|
|
|
Re: PB d'utilisation d'une DLL |
|
---|---|---|
Animateur WDF
Inscrit:
19/01/2004 13:48 De www.sigmasys.fr
Post(s): 988
|
Bonjour,
On ne peut pas intégrer de code C++ directement dans WinDev. Pourquoi faire une deconnexion directement après la connexion en cas de succès ?
Bon dév., Totof
Contribution le : 25/05/2007 09:55
|
|
_________________
[ Totof(Christophe LOGEL) réalise des développements spécifiques WinDev (Mon annonce wdforge), http://www.sigmasys.fr] |
||
Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.