[VC++] Besoin d'un expert en DLL/mémoire partagé/allocation mémoire

Besoin d'un expert en DLL/mémoire partagé/allocation mémoire [VC++] - Programmation

Marsh Posté le 21-03-2002 à 10:41:51    

J'ai un problème assez bizarre et que je n'arrive pas à expliquer.
Attention c'est un peu compliqué.
 
Donc, j'ai un programme qui charge 2 Dlls. Une Dll 1 qui contient un gestionnaire de mémoire et par lequel passe tout les new (allocation mémoire) que je fais dans mon Exe et mes Dlls.
Et l'autre Dll 2 contient que truc dont une classe de Temps CTime qui utilise le QueryPerformanceFrequency() de windows.
 
Donc, mon problème est le suivant :
depuis mon Exe j'appelle un fonction de ma Dll 2 qui va faire un  
"CTime*   pTime:
 
pTime = new CTime;
pTime->Init()".
 
Le new est bien sur pris en charge par le la Dll 1.
Dans la fonction Init(), j'ai le code suivant :
"if (QueryPerformanceFrequency((LARGE_INTEGER*)&m_i64Frequency))
{
  return true;
}
return false;"
 
ou m_i64Frequency est une variable membre de ma classe CTime.
Donc le problème est à ce niveau là. En effet la fonction QueryPerformanceCounter me renvoie false !!
 
J'ai donc fais des tests, et si je met le code :
"
__int64   i64Frequency;
 
if (QueryPerformanceFrequency((LARGE_INTEGER*)&i64Frequency))
{
  m_i64Frequency = i64Frequency;
  return true;
}
return false;"
 
ça marche !!! L'appel à la fonction QueryPerformanceFrequency marche.
J'ai donc aussi essayer un autre test. Si pour la création de ma Classe CTime je fais :
"CTime        rTime;
 
rTime.Init();"
 
ou  
 
"CTime*       pTime;
 
pTime = (CTime*) malloc( sizeof(CTime) );
pTime->Init();"
 
ça marche niquel !!!!
Conclusion, apparemment la fonction QueryPerformanceFrequency() n'accepte pas les variables qui sont allouées dans une autre Dll, mais elle accepte les variables qui se trouve dans le Heap.
 
 
Pourtant mon Exe et mes Dlls sont tous compilés avec les options MultiThread Dll et Alignement sur 4 bytes.
 
Donc, es-ce que quelqu'un à une petite idée ?

Reply

Marsh Posté le 21-03-2002 à 10:41:51   

Reply

Marsh Posté le 21-03-2002 à 11:30:45    

ET ca ne viendrais pas de la valeur de i64Frequency ?
 
car dans le premier il est initialise par le constructeur et dans les autres il ne l'est pas

 

[jfdsdjhfuetppo]--Message édité par BENB--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 21-03-2002 à 13:17:39    

j'ai penser aussi à ça, j'ai donc essayé de l'initialiser, mais ce n'est pas ça.
 
Je vais faire un test en faisant un new de mon i64Frequency avant d'appeler la fonction pour vérifier que ça plante que quand la variable se trouve dans une autre zone mémoire.

Reply

Marsh Posté le 21-03-2002 à 13:30:57    

bon finalement si je fais
"__int64*   pi64Frequency= new __int64;  
 
if (QueryPerformanceFrequency((LARGE_INTEGER*)pi64Frequency))  
{  
 m_i64Frequency = i64Frequency;  
 return true;  
}  
return false;"
 
ça marche contrairement à ce que je pouvais penser. Donc c'est vraiment bizarre ce bug.

Reply

Sujets relatifs:

Leave a Replay

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