Application developpée sous W2k en Delphi 5, et reprise en Delphi 7 pour XP
cs_gremlins13
Messages postés7Date d'inscriptionvendredi 19 septembre 2003StatutMembreDernière intervention13 octobre 2008
-
10 oct. 2008 à 12:25
cs_gremlins13
Messages postés7Date d'inscriptionvendredi 19 septembre 2003StatutMembreDernière intervention13 octobre 2008
-
13 oct. 2008 à 14:34
Bonjour,
1 semaine que je galère pour rendre compatibles sous XP des applications qui tournaient sans pb sous W2k ou W98SE, et développées en Delphi5.
Ces applications utilisent différentes Dll développées ici aussi en interne. Ces app refusent de démarrer sous XP, aucun message, aucune erreur, elles 'freezent' tout simplement dès le lancement. Je reprends ces développement avec Delphi7 sous XP, histoire de recréer ces exécutables sur les OS de destination, mais je ne parviens pas à cerner l'origine du pb j(ai positionné un max de points d'arret mais apparemment, l'exécution n'arrive même pas jusque là, donc j'en concluerais à un pb de gestion de mémoire. Les applis utilisent 'Sharemem' en première position dans les Uses des projets. J'ai également tenté de remplacer Sharemem par FastSharemem mais sans meilleur résultat. Je voudrais au moins comprendre le pb avant de trouver une solution... Je suis vraiment en galère, tout devant migrer vers XP dans le mois qui vient.
Hervé
A voir également:
Application developpée sous W2k en Delphi 5, et reprise en Delphi 7 pour XP
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 10 oct. 2008 à 19:30
Salut,
Zarbi. Delphi 7 incompatible avec <strike>Vista</strike> XP ce serait une première. Et XP et 2000 ont une architecture vraiment semblable.
Sharemem est assez peu utilisée (surtout du fait que cela rend les dll incompatible avec les .exe des autres langages), mais quand même, de là à ce viander...
Pour le coup des points d'arrêt qui ne passe pas... Les .exe et .dll ont un point d'entrée exécuté par le loader (Appelons ça un main pour les .exe et un dllmain pour une dll) de Windows quand il charge un .exe en mémoire.
Si tu ne parviens pas à mettre en place un point d'arrêt dans ton .exe, cela peut être dû au fait qu'une dll ne parvienne pas à se charger à cause d'un mauvais code dans son dllmain. Néanmoins il me semble que dans ce cas là, windows affiche un message explicite, style le module ne peut être chargé, ou est introuvable.
Pour tester l'initialisation de tes dlls, tu peux faire un test relativement simple. Dans une console tu tape :
ntsd MonExeATester.exe
En faisant l'hypothèse que la console puisse trouver ton .exe.
Cela t'affichera la liste des dlls chargées et l'exécution s'arrêtera avant l'exécution du point d'entrée de l'exe.
ntsd devrait te donner la main en affichant ça :
ntdll!DbgBreakPoint:
7c911230 cc int 3
0:000>
Pour complèter le test tu peux aller jusqu'au point d'entrée du .exe en tapant :
!dh NomDuModule.exe
Tu peux y trouver le point d'entrée et l'adresse de l'image :
739D address of entry point
1000 base of code
----- new -----
01000000 image base
Tu met un point d'arrêt avec la commande bp, à l'adresse du point d'entrée. Pour avoir l'adresse du point d'entrée, il suffit d'additionner l'adresse de l'image et du point d'entrée. Ici :
bp 0100739D
Puis tu lance l'exécution avec g :
g
ntsd devrait te rendre la main à l'adresse du main. Tu peux éventuellement poursuivre l'exécution avec g... Mais je suppose que ton programme aura merdé avant.
cs_gremlins13
Messages postés7Date d'inscriptionvendredi 19 septembre 2003StatutMembreDernière intervention13 octobre 2008 13 oct. 2008 à 08:52
Je vais passer mon lundi à tenter cette solution.... en priant que cela me donne au moins une idée de la piste à suivre. Un autre forum m'a donné une autre idée, celle de l'appel à des api windows qui se feraient par leur numero et pas par leur nom. Comme certains numéros ont changé parait-il entre w2k et XP...
Je vais tester tout ça...
cs_gremlins13
Messages postés7Date d'inscriptionvendredi 19 septembre 2003StatutMembreDernière intervention13 octobre 2008 13 oct. 2008 à 09:35
Rt15, Salut,
Je tente de réaliser ce que tu préconise en commande console, j'ai bien une réponse au ntsd, mais apres !! ça se complique : Voilà ce que j'obtiens
ntdll!DbgBreakPoint:
7c911230 cc int 3
0:000> !dh x:launch.exe
*** WARNING: Unable to verify checksum for image00400000
*** ERROR: Module load completed but symbols could not be loaded for image00400000
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\kernel32.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\user32.dll-
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\GDI32.dll-
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\advapi32.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\RPCRT4.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\oleaut32.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\msvcrt.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\ole32.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for X:\b
orlndmm.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\version.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\comctl32.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\winspool.drv -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\shell32.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\SHLWAPI.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\comdlg32.dll -
*** WARNING: Unable to verify checksum for X:\AtaDllPrint.dll
*** ERROR: Symbol file could not be found. Defaulted to export symbols for X:\A
taDllPrint.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\olepro32.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\imm32.dll -
*** WARNING: Unable to verify checksum for X:\AtaDllUser.dll
*** ERROR: Symbol file could not be found. Defaulted to export symbols for X:\A
taDllUser.dll -
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\W
INDOWS\system32\winmm.dll -
0:000>
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 13 oct. 2008 à 10:10
Petites précisions :
Les messages d'erreurs que tu as ici sont normales : tu ne dispose effectivement pas des symboles de débogage des modules mentionnés. Mais ce n'est pas pas un problème.
Tu as l'air d'utiliser 3 dlls perso :
orlndmm.dll
AtaDllPrint.dll
AtaDllUser.dll
cs_gremlins13
Messages postés7Date d'inscriptionvendredi 19 septembre 2003StatutMembreDernière intervention13 octobre 2008 13 oct. 2008 à 11:25
Non, il n'en manque pas, il y en avait une quatrieme, que j'ai disséquée en unités incluses dans des uses, il en reste 2 AtaDllPrint, ATADlluser. Borlndll est en fait une dll Borland qui est ajoutée automatiquement pour pouvoir utiliser sharemem entre autre
cs_gremlins13
Messages postés7Date d'inscriptionvendredi 19 septembre 2003StatutMembreDernière intervention13 octobre 2008 13 oct. 2008 à 11:29
Voici le resultat :
0:000> !dh image00400000
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (i386)
9 number of sections
2A425E19 time date stamp Sat Jun 20 00:22:17 1992
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
818E characteristics
Executable
Line numbers stripped
Symbols stripped
Bytes reversed
32 bit word machine
OPTIONAL HEADER VALUES
10B magic #
2.25 linker version
1A6000 size of code
5E35B6 size of initialized data
0 size of uninitialized data
1A6E20 address of entry point
1000 base of code
----- new -----
00400000 image base
1000 section alignment
200 file alignment
2 subsystem (Windows GUI)
4.00 operating system version
0.00 image version
4.00 subsystem version
78F000 size of image
400 size of headers
0 checksum
00100000 size of stack reserve
00004000 size of stack commit
00100000 size of heap reserve
00001000 size of heap commit
0 [ 0] address [size] of Export Directory
1AC000 [ 2E04] address [size] of Import Directory
1D2000 [ 69A00] address [size] of Resource Directory
0 [ 0] address [size] of Exception Directory
0 [ 0] address [size] of Security Directory
1B1000 [ 200B0] address [size] of Base Relocation Directory
23C000 [ 1] address [size] of Debug Directory
0 [ 0] address [size] of Description Directory
0 [ 0] address [size] of Special Directory
1B0000 [ 18] address [size] of Thread Storage Directory
0 [ 0] address [size] of Load Configuration Directory
0 [ 0] address [size] of Bound Import Directory
0 [ 0] address [size] of Import Address Table Directory
0 [ 0] address [size] of Reserved Directory
0 [ 0] address [size] of Reserved Directory
0 [ 0] address [size] of Reserved Directory
SECTION HEADER #1
CODE name
1A5ED0 virtual size
1000 virtual address
1A6000 size of raw data
400 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60000020 flags
Code
(no align specified)
Execute Read
SECTION HEADER #2
DATA name
3B0C virtual size
1A7000 virtual address
3C00 size of raw data
1A6400 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
C0000040 flags
Initialized Data
(no align specified)
Read Write
SECTION HEADER #3
BSS name
FA1 virtual size
1AB000 virtual address
0 size of raw data
0 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
C0000000 flags
(no align specified)
Read Write
SECTION HEADER #4
.idata name
2E04 virtual size
1AC000 virtual address
3000 size of raw data
1AA000 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
C0000040 flags
Initialized Data
(no align specified)
Read Write
SECTION HEADER #5
.tls name
10 virtual size
1AF000 virtual address
0 size of raw data
0 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
C0000000 flags
(no align specified)
Read Write
SECTION HEADER #6
.rdata name
18 virtual size
1B0000 virtual address
200 size of raw data
1AD000 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
50000040 flags
Initialized Data
Shared
(no align specified)
Read Only
SECTION HEADER #7
.reloc name
200B0 virtual size
1B1000 virtual address
20200 size of raw data
1AD200 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
50000040 flags
Initialized Data
Shared
(no align specified)
Read Only
SECTION HEADER #8
.rsrc name
69A00 virtual size
1D2000 virtual address
69A00 size of raw data
1CD400 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
50000040 flags
Initialized Data
Shared
(no align specified)
Read Only
SECTION HEADER #9
.debug name
552BB6 virtual size
23C000 virtual address
552BB6 size of raw data
236E00 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
50000040 flags
Initialized Data
Shared
(no align specified)
Read Only
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 13 oct. 2008 à 12:27
borlndmm -> Ah vi j'avais zapé le b et je l'avais donc pas reconnu.
"Et l'application reste plantée là .... :("
Elle boucle (Consommation CPU importante) ?, elle plante (Dispariation du gestionnaire des tâches) ?, elle est gelée (Consommation CPU nulle mais présente dans le gestionnaire des tâches) ?
Bon, le problème a donc lieu avant l'appel du point d'entré de l'exe. Sachant que les points d'entrées des dlls sont appelés entre le point d'arrêt initial et l'exécution du point d'entrée de l'exe :
When the debugger starts a new target application, an initial breakpoint automatically occurs after the main image and all statically-linked DLLs are loaded but before any DLL initialization routines are called.
Tu peux mettre des points d'arrêts au points d'entré de tes dlls de la même manière que ce que tu as fait pour l'exe, à ceci près que les dlls sont pas forcément chargées à l'emplacement spécifié dans le header.
Il faut que tu tapes la commande lmi sans argument. Là tu as la liste des modules chargé et les adresses où ils sont chargés :
start end module name
01000000 01014000 notepad (deferred)
Ici, le module notepad est chargé à l'adresse 01000000 (Jusqu'à l'adresse 01014000, mais ce n'est pas le problème).
Avec lmi tu récupère l'adresse des dlls qui t'intéressent (Les tiennes + borlndmm).
Puis tu utilises !dh sur chacunes de ces dlls pour récupérer le point d'entré. Tu additionne le point d'entrée avec l'adresse de chargement comme pour l'exe, et tu mets des points d'arrêt à ces adresses.
De cette manière, tu devrais parvenir à déterminer quelle dll pose problème.
Tu peux aussi essayer de chercher dllproc dans le source de tes dlls en Delphi : c'est à l'aide de cette variable que l'on spécifie à Delphi quelle fonction est le point d'entrée de notre dll.
cs_gremlins13
Messages postés7Date d'inscriptionvendredi 19 septembre 2003StatutMembreDernière intervention13 octobre 2008 13 oct. 2008 à 14:34
Pour répondre à ta question : l'application est gelée, ne prend aucune ressource. Pour le reste je vais faire comme tu dis et voir si ça me fait avancer. Sinon tant pis, je vais mettre toutes mes unités dans un répertoire commun et les inclure séparément dans mes applications. Perte de temps et bricolage, mais il faut bien trouver une solution.
Merci en tous cas pour tes précieux conseils... je te tiens au courant