ODBC, SQLDisconnect, COM

ODBC, SQLDisconnect, COM - C++ - Programmation

Marsh Posté le 21-05-2003 à 12:44:57    

J'ai un objet COM qui a comme membre un objet static  
Cet objet static initialise une connection ODBC vers une base Access.
Quand le programme appellant l'objet COM se décharge de la memoire, le destructeur de l'objet static est appelé.
Ca c'est normal ( et voulu )
Par contre quand le descructeur appel la fonction SQLDisconnect, windows ferme violemment le programme en indiquand "L'inscruxction xxxx a tenté d'utiliser l'adresse mémoire xxx qui ne peut être read..."
 
Par contre si je l'objet en question n'est plus static il n'y a plus de problème.
 
Sachant que tout ceci fait parti d'un programme particulièrement mal conçu et que la seul façon de débuger est de faire des fichiers de trace, si quelqu'un avait déja rencontré un problème similaire...

Reply

Marsh Posté le 21-05-2003 à 12:44:57   

Reply

Marsh Posté le 21-05-2003 à 14:16:02    

A l'intuition :  
 
(Si l'objet est en statique => plantage) et (l'objet pas statique => OK)
 
je me demande s'il n'y pas 2 tentatives d'appel de SQLDisconnect donc ma question est :  
 
Crées-tu 2 instances de ton objet COM ? (qui partagerait donc la même variable de classe)
 
2 solutions:
* variable pas statique
* variable remise à NULL après un appel conditionnel à SQLDisconnect si la variable n'est pas NULL.
 
 
 
 


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 21-05-2003 à 14:28:07    

Merci pour ton aide mais visiblement j'ai pas été très clair :
je resume, j'ai cela
 
class MonODBC
{
 MonODBC()
 ~MonODBC(){ ::SQLDisconnect(...);}
};
 
class MonCOM
{
 static MonODBC mODBC;  
};
 
Le problème arrive au moment ou le programme utilisant un objet de type MonCOM se décharge de la mémoire ( après la fin du main)
A ce momentle destructeur de mODBC est applelé ( normal ) et plantage lors de l'appel à SQLDisconnect.
 
SQLDisconnect ( fonction de lAPI ODBC qui prend un pointeur)  
n'est appelée q'une seule fois ( je trace les appels ) et de toute façon d'après la doc elle est capable de retourner une erreur en cas de pointeur invalide
 
mODBC étant un objet il ne peut pas être NULL.


Message édité par seblamb le 21-05-2003 à 14:28:33
Reply

Marsh Posté le 21-05-2003 à 14:39:48    

seblamb a écrit :

Merci pour ton aide mais visiblement j'ai pas été très clair :
je resume, j'ai cela
[...]


 
Ah ok, c'est plus subtil... :/
Alors, autre hypothèse : Est-ce qu'il y a des threads dans l'histoire ?


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 21-05-2003 à 14:48:51    

Le problème se produit avec ou sans thread, c'est quoi l'idée ?

Reply

Marsh Posté le 21-05-2003 à 14:56:45    

seblamb a écrit :

Le problème se produit avec ou sans thread, c'est quoi l'idée ?


 
Ben je ne sais pas. Le SQLDisconnect prend un certain temps donc si l'objet est libéré paralellement dans un autre thread, l'instruction juste après le SQLDisconnect peut être indéfinie.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 22-05-2003 à 10:49:45    

Bon ben j'ai trouvé une solution pour résoudre ce problème : virer Access  :bounce: , car visiblement sous SQL Server ce problème ne se pose pas.
Donc la solution c'est MSDE ( un SQL Server light)
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed