begin process at 2010 03 22 11:32:47
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Limitation d'une DLL


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Limitation d'une DLL

mardi 8 février 2005 à 09:20:00 | Limitation d'une DLL

ptitmanu

Bonjour,
J'ai une question assez pointue sur les DLL. Depuis quelques temps je m'interesse de pres aux DLL, à leurs limitations et leur fonctionnement.
J'ai constaté que la taille maximale d'une variable, valeur de retour d'une methode exportée par une DLL est de 6000 octets. Est ce que cela vous semble normal ? Est ce un hasard, voir une erreur ? Quelqu'un connaitrait il l'origine de cette limite, et si oui, en existe t il d'autres du meme genre ?
Pour etre plus precis quant à mon probleme, j'ai une methode dans une DLL qui retourne une chanine de caractere assez longue. Il ne semble pas y avoir de probleme en interne de la DLL. Mais lorsque l'on recupere cette chaine à l'exterieur de la DLL, nous avons droit à une limitation à 6000 octets.
Si quelqu'un à des lectures TRES detaillée sur la vie et comportement des DLL, je suis preneur. D'avance merci.
Emmanuel.
mardi 8 février 2005 à 10:16:14 | Re : Limitation d'une DLL

ymca2003

Richter :
[ Lien ]
[ Lien ]

Sinon, une chaîne de caractères c'est normalement simplement un pointeur sur le premier caractère de la chaîne.

Si la chaîne fait 6000 octets, elle doit être allouée dynamiquement (malloc, new, HeapAlloc, VirtaulAlloc...) et retournée par une fonction de la dll. Une autre fonction doit alors permettre de la libérer (en prenant comme param le pointeur).

Donc il devrait y avoir 2 fonction du genre :
char* GetString();
void FreeString(char* s);
mardi 8 février 2005 à 10:33:37 | Re : Limitation d'une DLL

boumarsel

Réponse acceptée !
je pense qu'il faut ajouter une ligne dans le fichier .def de ton projet.
c'est HEAPSIZE ... (la taille)
bonne chance
a+
mardi 8 février 2005 à 10:35:19 | Re : Limitation d'une DLL

ptitmanu

Bonjour,
Merci de ta reponse, mais malheureusement la reference que tu donnes ne contient pas la reponse à mes questions. Je l'ai déjà lue. Elle est vraiment bien, mais pas encore assez pointue... Je suis au courant pour l'histoire d'allocation de mémoire... :-)
Je sais aussi qu'il ne faut pas désallouer un objet alloué dans un runtime, dans un autre runtime, et donc qu'il faut prévoir des méthode permettant de detruire les objets créée dans une DLL et manipulé à l'exterieur.
Non la question est un peu plus compliquée. Mon constat est qu'une chaine correctement allouée dans une DLL, ayant une taille de plus de 8500 octets, se retrouve tronquée à 6000 octets à l'exterieur de la DLL. (pour info elle est allouée avec un malloc, faudrait il faut un HeapAlloc ?, je n'y connait pas grand chose en Heap).
Voila.

Emmanuel.
mardi 8 février 2005 à 10:45:06 | Re : Limitation d'une DLL

ymca2003

Si elle est tronquée c'est peut-être qu'il y a un problème d'écrasement mémoire. Il suffit pour cela qu'une instruction aille écrire un 0 à l'octet numéro 6000 de ta chaîne. Une dll peut allouer autant de mémoire que le système le permet. C'est d'ailleurs une fonction d'une dll (kernel32) qui fait les allocations sous windows (VirtualAlloc). Par ailleurs, tu peux essayer d'utiliser cette fonction.
mardi 8 février 2005 à 10:50:15 | Re : Limitation d'une DLL

cosmobob

salut,
si malloc ne renvoie pas d'erreur (cad le pointeur NULL), si tu as fait un malloc(8500) alors 8500 octets ont été alloués! Comment sais tu que seulement 6000 octets l'ont été? malloc ne renvoie pas le nombre d'octets effectivement alloués...
De plus la DLL est mappée dans l'espace mémoire du processus qui l'utilise, si tu fais une allocation dynamique, aucune différence entre faire un malloc depuis le code de l'exe ou depuis le code de la DLL...
Je pense que l'erreur vient d'ailleurs. Pour tester remplace malloc par HeapAlloc(GetProcessHeap(),0,nb_octets); (ce qui risque de ne rien changer car malloc fait finalement appel a cette fonction), et remplace free par HeapFree(GetProcessHeap(),0,adresse);
enfin bref, poste un bout de code, a mon avis c'est un bug qui vient d'un autre endroit..
a++
mardi 8 février 2005 à 10:53:09 | Re : Limitation d'une DLL

cosmobob

ha en plus, si le nombre d'octets de la chaine est limité a 8500, tu peux faire un truc du genre:

char* Traiterment(....) //fonction dans la DLL
{
   static char retour[8500];
   // tu mets ce qu'il faut dans retour

   return retour;
}

si ta fonction n'est appelée que depuis un seul thread t'auras pas de problèmes.
a+

mardi 8 février 2005 à 11:08:42 | Re : Limitation d'une DLL

Arnotic

Administrateur CodeS-SourceS
Suffit d'envoyer à la DLL un pointeur sur une zonne mémoire allouée (ou alors la dll allouera la mémoire) et elle retourne ce pointeur donc plus de limites.

@+
Arnotic,
Admin CS, MVP Visual C++
mardi 8 février 2005 à 11:09:57 | Re : Limitation d'une DLL

ptitmanu

Alors merci pour ces reponses.
Mais je  voudrais preciser certains détails. Il y a une grande différence entre le fait d'allouer un objet dans une DLL ou dans l'exe qui fait appel à la DLL. En effet, ils partagent le meme espace mémoire. Enfin en théorie... Si la DLL et l'exe utilise des run time différents, alors la mémoire est gérée un êu différemment. C'est pour cela qui ne faut pas désallouer un objet alloué dans un autre run time sous peine de corrompre le Heap concerné par la désallocation... Pour exemple, un programme (exe) ecrit en Delphi ne peut ou plutot ne doit detruire un objet alloué dans une DLL ecrite en C++: run time different.
De plus il n'y a pas de réelle difference me semble t il entre déclarer un tableau static de taille fixe alloué à la compilation, et le fait d'alloué un tableau dynamiquement. Je precise mon propos. Si l'allocation dynamique s'est bien passée, alors l'espace est alloué est il n'y a plus de difference entre les deux types d'allocation
Voila pour Cosmobob.


Sinon je garantie une bonne allocation de ma chaine dans la DLL. Elle est verifiée, testée eprouvée, blindée. Donc l'allocation est bonne, complete et correcte et fait bien plus de 8500 octets. Mais une fois recuperée à l'exterieur de la DLL, il n'y a plus rien apres 6000 octets, et une analyse au déboggeur Visual me peremt de constater que la memoire apres n'est pas initialisée... Ou sont passé mes 2500 octets manquant ?

Je vais chercher du coté de HEAPSIZE dans le fiichier .def, mais Boumarsel aurais quelques precision sur la syntaxe, et sur les parametres utilisables dans le fichier .def. Je n'arrive pas à trouver de refernece sur comment s'ecrit un fichier DEF, et surtout quelles sont les options possibles.

Merci encore pour vos reponses.
Emmanuel.
mardi 8 février 2005 à 11:23:42 | Re : Limitation d'une DLL

ymca2003

Si l'allocation est bonne, initialise la chaîne entière avec des octets précis (ce que fait en mode Debug la fonction malloc).Si à un autre endroit du prog tu ne retrouve pas tes octets alors que ton prog n'est pas censé modifier cette chaîne c'est qu'il y a un buffer overflow, une autre fonction qui n'a rien a voir écrit au delà d'un autre buffer.

Je crois qu'avec visual on peut faire un break lorsqu'une variable ou un tableau est modifié (utilisation pas très évidente surtout avec des dlls).

A mon avis, ton problème ne vient pas d'une histoire d'allocation mémoire mais plus d'un écrasement mémoire (les plus durs à détecter...)

1 2

Cette discussion est classée dans : methode, dll, octets, semble, limitation


Répondre à ce message

Sujets en rapport avec ce message

Shell 32 lie a une exportation manquante shlwapi.dll:shrreggetusvalua sous Win 98SE, a résoudre sous dos [ par frp01 ] Concernant : Shell 32 lie a une exportation manquante shlwapi.dll:shrreggetusvalua sous Win 98SE, a résoudre sous dos. Appel DLL C++ depuis NSDK [ par wislam2007 ] Salut les amis, franchement dans la merde! avec une dll c++. Je doit appelé une methode de cette DLL depuis une environnement NSDK, Sachant que cette Chargement dll c++ [ par wislam2007 ] Salut Je charge sur mon programme (DLL1 c++) une librarie .tlb, est ce que lors de l'appel de la DLL1 c++, je doit mettre la librairie dans un endro Probleme pour creer une dll sous Windows [ par Micro_and_Macro ] Bonjour, Comme le dit le sujet j'ai actuellement un soucis pour creer une dll, en fait le soucis que je rencontre c'est (rien de mieux qu'un exemple) Comment utiliser "loadFrom" dans un manifest d'une application [ par braxivamov ] Bonjour, pour faire simple j'ai recodé quelques dll du style gdi32.dll. J'ai exporté les fonctions de la dll originale, j'ai remplacé le fonctionneme chargement dll c# depuis c++ [ par wislam2007 ] Salut, quand je test sur mon poste l'appel d'une dll c++ qui appel une dll (.tlb) c# ça fonctionne sans probleme, par contre quand je passe a un aut [BAR]xvid.dll not found [ par wajdi86 ] lorsque e j'ouvre mon pc un message d'erreur (xvid.dll not found) qu'est ce que je doit faire pour l'enlever j'ai essayé plusieurs logiciels mais le p Dll g++ sous VS [ par greenzephyr ] Salut à tous, Je dois faire une appli Windows Form qui utilise une dll compilée sous Linux avec g++. Je dispose des sources de cette dll. Pour vous problème sur l'utilisation d'une dll sous VB [ par goffle ] Bonjour, J'ai réaliser il y a quelque temps une programme qui me permettait de contrôler le port parallèle grâce a la dll inpout32 sous code::blocks Enregistrer une dll [ par wislam2007 ] Salut je veux enregistrer mes dll (une en c++ et la 2eme en c#) mais avec la commande regsvr32 /i nomdeladll me renvoie l erreur : la dll a étai char


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales