PB d'utilisation d'une DLL
Stagiaire WDF
Inscrit:
14/05/2007 14:53
Post(s): 21
Bonjour à tous,

Je rencontre un soucis d'utilisation d'une DLL.
J'ai écrit cette DLL en C++ sous Dev-C++. Elle me permet de créer une source de données ODBC, de me connecter à une base de données SQL Server à partir de cette source et de lancer un export de données par BCP.
J'ai créé cette DLL pour émuler l'utilitaire BCP sans avoir à ouvrir une console DOS car les utilisateurs de mon application n'ont pas les autorisations sur les consoles DOS pour des raisons de sécurité.

Mon soucis intervient au niveau de son exécution. J'arrive à utiliser la DLL dans un programme C++ en utilisant la librairie générée lors de la création de la DLL. Je n'ai aucun soucis. Lors de l'utilisation de la DLL dans WinDev 10, je reçoit un code de retour indiquant que la connexion SQL, via SQLConnect(), a échoué. Or j'utilise la même liste de paramètres qu'en C++.

Question :
Est-ce que WD 10 permet les connexions SQL dans des DLLs ? Comment puis-je contourner ce problème ?

En vous remerciant pour votre aide.

Coridalement,
Nicolas L.

Contribution le : 22/05/2007 10:49
Créer un fichier PDF de la contribution Imprimer


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]
Créer un fichier PDF de la contribution Imprimer


Re: PB d'utilisation d'une DLL
Stagiaire WDF
Inscrit:
14/05/2007 14:53
Post(s): 21
Bonjour,

Je ne crois pas que ce soit un problème de paramètres. J'utilise qu'un seul type de paramètres des char*. Je n'ai aucun problème de transtypage car j'arrive à créer une source de données ODBC dans la fonction de ma DLL puis ma fonction sort sur une erreur de connexion à la base de données via SQLConnect() de la DLL ODBC32.dll.

Je ne sais pas pourquoi j'arrive à effectuer le début de mon traitement mais pas le reste. Une fois que les paramètres sont passés le typage n'intervient plus.

Si quelqu'un à une idée. Je commence à sécher et j'en ai vraiement besoin.

Cordialement,
Nicolas L.

Contribution le : 22/05/2007 15:29
Créer un fichier PDF de la contribution Imprimer


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]
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


Re: PB d'utilisation d'une DLL
Utilisateur WDF
Inscrit:
03/04/2006 15:00
Post(s): 72
je regarde ton code en C et je me demande s'il n'y a pas un problème de type. Je veux dire par là, les chaînes en C doivent être terminée par un zéro. Peut-être est ce là que ça ce passe. As-tu affiché le code retourné par ce SQLconnect ? et éventuellement trouvé à quoi ça correspond sur la doc odbc/sql ?
Autre test : mets la valeur en dur dans la dll : j'ai vu que tu faisais un cast de type (SQLCHAR *).

Contribution le : 24/05/2007 13:20
Créer un fichier PDF de la contribution Imprimer


Re: PB d'utilisation d'une DLL
Stagiaire WDF
Inscrit:
14/05/2007 14:53
Post(s): 21
Oui, j'ai déjà affiché le code retour du SQLConnect(), il correspond à une constante SQLERROR.
Je vais prendre ta suggestion en compte et effectuer un test, tu as peut être raison. Je te tiens informer dès que j'ai les premiers résultats.

Merci pour ton aide .

Cordialement,
Nicolas L.

Contribution le : 24/05/2007 16:33
Créer un fichier PDF de la contribution Imprimer


Re: PB d'utilisation d'une DLL
Stagiaire WDF
Inscrit:
14/05/2007 14:53
Post(s): 21
J'ai effectué le test en ajoutant le \0 à la fin des chaines conerné par le SQLConnect() mais ça ne change rien à la donne.

De plus, j'ai effectué le même test directement en appelant la DLL dans un code C++ et ça ne fonctionne pas.

Petite question:
Est-il possible d'intégrer un bout de code C++, ou en exécuter un, sans effectuer de LanceAppli(), dans une application WinDev 10. De cette manière je pourrai effectué l'appel de la DLL directement en C++.

Merci pour votre aide.

Cordialement,
Nicolas N.

Contribution le : 24/05/2007 16:54
Créer un fichier PDF de la contribution Imprimer


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 ?

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);




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]
Créer un fichier PDF de la contribution Imprimer


Re: PB d'utilisation d'une DLL
Utilisateur WDF
Inscrit:
03/04/2006 15:00
Post(s): 72
As-tu affiché les chaînes que tu reçois dans ta dll ?

sprintf(temp,"DSN=%s* Server=%s* Database=%s* Trusted_Connection=No*",DSN,server,database);
essaye d'écrire cette chaine dans un fichier pour voir ce que tu récupéres...

Je pense que ça ce passe la dedans...
Essaye en mettant en dur la valeur de tes éléments de ta fonctions SQLconnect

Contribution le : 25/05/2007 10:07
Créer un fichier PDF de la contribution Imprimer


Re: PB d'utilisation d'une DLL
Stagiaire WDF
Inscrit:
14/05/2007 14:53
Post(s): 21
Bonjour à tous,

J'ai trouvé la solution avec un de mes collègues. Le problème était que pour faire mais test je passais directement mes valeurs à ma fonction C++. Du coup il me fallait doublé le caractère "\" car ces un caractère spécial dans C++. Mais lorsqu'on passe par variable le carctère "\" fait parti de la variable du coup plus besoin de le doubler.

Les problèmes les plus lourd ont souvent une réponse évidente. Du coup j'ai remplacé les "\\" par un "\" et retester: la fonction de ma DLL s'exécute bien.

Je m'excuse donc car j'aurai du voir cette solution.

Merci quand même pour votre aide.

Cordialement,
Nicolas L.

Contribution le : 25/05/2007 17:42
Créer un fichier PDF de la contribution Imprimer


Re: PB d'utilisation d'une DLL
Stagiaire WDF
Inscrit:
14/05/2007 14:53
Post(s): 21
Citation :

Totof a écrit:
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 ?

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);




Bon dév.,

Totof


C'était juste un exemple. Après ma connexion SQL, j'effectue des traitements pour extraire le résultats d'une requête sous forme de fichier via les DLLs de l'utilitaire BCP.

Cordialement,
Nicolas L.

Contribution le : 25/05/2007 17:45
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


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.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2