Application developpée sous W2k en Delphi 5, et reprise en Delphi 7 pour XP

cs_gremlins13 Messages postés 7 Date d'inscription vendredi 19 septembre 2003 Statut Membre Dernière intervention 13 octobre 2008 - 10 oct. 2008 à 12:25
cs_gremlins13 Messages postés 7 Date d'inscription vendredi 19 septembre 2003 Statut Membre Dernière intervention 13 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:

10 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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.

Bon courage.
0
cs_gremlins13 Messages postés 7 Date d'inscription vendredi 19 septembre 2003 Statut Membre Dernière intervention 13 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...

Merci  à plus

Hervé
0
cs_gremlins13 Messages postés 7 Date d'inscription vendredi 19 septembre 2003 Statut Membre Dernière intervention 13 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>

Hervé
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
13 oct. 2008 à 09:43
Il faut lui donner le bon nom de module :

!dh image00400000
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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

Il n'en manque pas ?

Un tuto sur ntsd.
0
cs_gremlins13 Messages postés 7 Date d'inscription vendredi 19 septembre 2003 Statut Membre Dernière intervention 13 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

Hervé
0
cs_gremlins13 Messages postés 7 Date d'inscription vendredi 19 septembre 2003 Statut Membre Dernière intervention 13 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

Debug Directories(0)
        Type       Size     Address  Pointer

0:000>

Hervé
0
cs_gremlins13 Messages postés 7 Date d'inscription vendredi 19 septembre 2003 Statut Membre Dernière intervention 13 octobre 2008
13 oct. 2008 à 11:40
puis l'execution à l'adresse 005A6E20  :

0:000> bp 005A6E20
0:000> g
ModLoad: 762f0000 76300000   C:\WINDOWS\system32\WINSTA.dll
ModLoad: 6fee0000 6ff34000   C:\WINDOWS\system32\NETAPI32.dll
ModLoad: 77390000 77493000   C:\WINDOWS\WinSxS\x86_Microsoft.Win
rols_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll
ModLoad: 5de20000 5de28000   C:\WINDOWS\system32\rdpsnd.dll
ModLoad: 76ba0000 76bab000   C:\WINDOWS\system32\PSAPI.DLL
ModLoad: 74690000 746db000   C:\WINDOWS\system32\MSCTF.dll
ModLoad: 71a60000 71a72000   C:\WINDOWS\system32\MPR.dll
ModLoad: 75ef0000 75ef7000   C:\WINDOWS\System32\drprov.dll
ModLoad: 71b70000 71b7e000   C:\WINDOWS\System32\ntlanman.dll
ModLoad: 71c30000 71c47000   C:\WINDOWS\System32\NETUI0.dll
ModLoad: 71bf0000 71c30000   C:\WINDOWS\System32\NETUI1.dll
ModLoad: 71be0000 71be7000   C:\WINDOWS\System32\NETRAP.dll
ModLoad: 71b50000 71b63000   C:\WINDOWS\System32\SAMLIB.dll
ModLoad: 75f00000 75f09000   C:\WINDOWS\System32\davclnt.dll
ModLoad: 77b50000 77b72000   C:\WINDOWS\system32\appHelp.dll
ModLoad: 76f80000 76fff000   C:\WINDOWS\system32\CLBCATQ.DLL
ModLoad: 77000000 770d4000   C:\WINDOWS\system32\COMRes.dll

Et l'application reste plantée là ....   :(
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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.
0
cs_gremlins13 Messages postés 7 Date d'inscription vendredi 19 septembre 2003 Statut Membre Dernière intervention 13 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

Hervé
0
Rejoignez-nous