Accueil > Forum > > > > Limitation d'une DLL
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
|
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...)
|
|
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
Livres en rapport
|
Derniers Blogs
[WF4] PASSAGE D'ARGUMENTS LITERAL, VISUALBASICVALUE OU LAMBDAVALUE?[WF4] PASSAGE D'ARGUMENTS LITERAL, VISUALBASICVALUE OU LAMBDAVALUE? par JeremyJeanson
Avec la sortie de la RC de Visual Studio 2010, Microsoft a mis un peu les points sur leS i en ce qui concernait le passage d'arguments. Mais nous somme un certain nombre à avoir pris ce changement comme un coup dur. Pour résumer la situation : à la sortie...
Cliquez pour lire la suite de l'article par JeremyJeanson [RIA SERVICES] INCLUDE ET DOMAINDATASOURCE[RIA SERVICES] INCLUDE ET DOMAINDATASOURCE par Audrey
Dans un de mes articles précédents , j'avais parlé des DomainDataSource avec RIA Services dans le cas d'une interface Maître - Détail. Dans le même principe, je vais parler d'une autre manière de mettre en forme ce cas d'interface avec RIA Services. Et po...
Cliquez pour lire la suite de l'article par Audrey ZUNE : VERSION ZUNE SOFTWARE V 4.2 ET LA SOCIALISATIONZUNE : VERSION ZUNE SOFTWARE V 4.2 ET LA SOCIALISATION par ROMELARD Fabrice
Une des nouveautés de la version V 3.0 était l'apparition de l'onglet Social qui ne fonctionnait que si le MarketPlace était activé sur son poste. Cela limitait donc son intérêt, car hors du cadre commercial USA-CANADA, peu de monde trouva...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice PRATIQUE DE SILVERLIGHT PAR ERIC AMBROSIPRATIQUE DE SILVERLIGHT PAR ERIC AMBROSI par MPOWARE
Je viens de finir la lecture du dernier livre d'
Eric Ambrosi
éditions PEARSON
Son livre donne une approche pratique de Silverlight qui sera aussi bien comprise par le développeur que par le designeur.
Tous les aspects du développement RIA sont abor...
Cliquez pour lire la suite de l'article par MPOWARE APPRENDRE à DéVELOPPER POUR LES MOBILES AVEC LA NOUVELLE GéNéRATION .NETAPPRENDRE à DéVELOPPER POUR LES MOBILES AVEC LA NOUVELLE GéNéRATION .NET par odewit
2 déclinaisons de Silverlight et 2 déclinaisons de Mono permettent dorénavant (ou permettront prochainement) de développer des applications .NET mobiles pour les principales plates-formes du marché :
Silverlight pour Symbian, basé sur Silverlight 2...
Cliquez pour lire la suite de l'article par odewit
Forum
A PROPOS DE L'HEUR A PROPOS DE L'HEUR par nadianana
Cliquez pour lire la suite par nadianana
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|