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
TECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURSTECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURS par ROMELARD Fabrice
Animé par: Laurent Cotton Le développement dans SharePoint 2010 passe par plusieurs axes qui seront évoqués dans cette session, mais plus particulièrement les développements simples lié au besoin Business Business Connectivity Services Ce BCS es...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOURTECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOUR par ROMELARD Fabrice
Cette session est la dernière pleinière de ces 3 jours de TechDays Paris 2010. Généralement, cette troisième journée est plus axée sur l'avenir vu par Microsoft. Après un retour sur l'avenir vu par la Science Fiction ou par ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion
Forum
RE : WIN APIRE : WIN API par racpp
Cliquez pour lire la suite par racpp
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|