[résolu] 5.40 b5 x86 et CreateWindowEx_()

Sujets variés concernant le développement en PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

[résolu] 5.40 b5 x86 et CreateWindowEx_()

Message par Anonyme2 »

J'ai installé les versions 32 et 64 bits de la 5.40

Je compile mon projet et mis à part une API je recompile après correction et la tout est OK à la compil des 2 versions.
J’exécute en 64 bits et ça semble ok.
Mais en 32 bits, j'ai une erreur mais qui ne plante pas car je ferme si l'API échoue (ça plante si j'enlève le test). Je trace le code et je tombe sur l'API CreateWindowEx_() qui échoue.

Code : Tout sélectionner

      ;// création de la ReBar de la ToolBar générale
     GLB_hHorizontal_Rebar = CreateWindowEx_(#WS_EX_TOOLWINDOW, "ReBarWindow32", #Null, #WS_CHILD | #WS_VISIBLE | #WS_CLIPSIBLINGS | #WS_CLIPCHILDREN | #RBS_VARHEIGHT | #CCS_NODIVIDER, 0, 0, 0, 0, hwndOwner, #Null, GLB_hInstance, #Null)
Ca fonctionne bien en 32 bits avec la version 5.31, il n'y a que la version 32bit 5.40 b5 qui échoue.

Un getlasterror_() et j'obtiens l'erreur 1400.
ERROR_INVALID_WINDOW_HANDLE

1400 (0x578)

Invalid window handle.
En traçant avec beaucoup de difficulté le code, hwndOwner n'a pas la bonne valeur.
J'obtiens des "procedure stack has been corrupted" avec le purificateur mais le problème vient en amont mais où ?

L'écrasement a lieu je ne sais ou, la seule chose que j'ai modifié pour pouvoir compiler c'est ça :

Code : Tout sélectionner

If SetWindowTheme_(ttip, @"", @"") = #S_OK
remplacé par

Code : Tout sélectionner

If SetWindowTheme_(ttip, "", "") = #S_OK
En passant Fred, les 2 "chaines" en paramètre peuvent valoir 0 (et pas une chaine vide).

On fait comment ?
pszSubAppName [in]

Type: LPCWSTR

Pointer to a string that contains the application name to use in place of the calling application's name. If this parameter is NULL, the calling application's name is used.
pszSubIdList [in]

Type: LPCWSTR

Pointer to a string that contains a semicolon-separated list of CLSID names to use in place of the actual list passed by the window's class. If this parameter is NULL, the ID list from the calling class is used.
Dernière modification par Anonyme2 le lun. 21/sept./2015 16:45, modifié 1 fois.
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: 5.40 b5 x86 et CreateWindowEx_()

Message par Fred »

Il y a une nouvelle constante #Null$ pour ca. Mais la beta 5 devrait permettre de remettre '0', comme avant.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: 5.40 b5 x86 et CreateWindowEx_()

Message par Anonyme2 »

Ok pour les constantes mais il y a un bug quelque part dans la version 32 bit de la beta 5 car tout fonctionne en 64 bits et tout fonctionne avec la 5.31 32 et 64 bits.

Je ne sais pas si c'est moi mais le purificateur m'est d'une aide peu précieuse. Je vais peut-être tracer si j'ai le temps avec le code d'origine que tu avais donné avant de l'intégrer à PB. C'est fastidieux mais on fini par isoler le problème.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: 5.40 b5 x86 et CreateWindowEx_()

Message par Anonyme2 »

Après plus de 5 heures à tracer le code, je n'ai pas encore trouvé mais j'avance.

En utilisant la macro _TestHeaps
http://www.purebasic.fr/blog/?p=55

je n'ai pas mis d'erreur en évidence. J'ai exécuté en 5.31 x86 avec l'affichage de chaque procédure dans laquelle je passe jusqu'au plantage, ensuite j'ai fait la même chose (avec le même débugger - l'autonome car j'ai bon essayer de lancer l'autre c'est toujours l'autonome qui s'ouvre -) avec la version 5.40 b5 x86.

J'ai comparé les résultats et là, on ne passe pas exactement dans les mêmes procédures à un moment donné, bizarre.

voici les procédures traitées en 5.31 x86

Code : Tout sélectionner

PIM_Set_BindEvent
PIM_DeCrypeFilesName
PIM_LecturePreferences_Langage
PIM_Set_Language_Version
PIM_GetEmptyDll_Empty_ICL_Memory
PIM_AllocateMemory
PIM_AllocateMemory
PIM_Version
PIM_GetWindowTitle
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Threaded_Load_Resource_String
PIM_Threaded_Load_Resource_String
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
Default
et voici la même chose en 5.40 b5 x86
PIM_Set_BindEvent
PIM_DeCrypeFilesName
PIM_LecturePreferences_Langage
PIM_Set_Language_Version
PIM_GetEmptyDll_Empty_ICL_Memory
PIM_AllocateMemory
PIM_AllocateMemory
PIM_Version
PIM_GetWindowTitle
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_Threaded_Load_Resource_String
PIM_Threaded_Load_Resource_String
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_Create_Istorage
PIM_Create_Istorage
PIM_Release_Istorage
PIM_AllocateMemory
PIM_Release_Istorage
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
PIM_AllocateMemory
PIM_FreeMemory
Default
A partir de la 16ème ligne, ce n'est plus la même chose ...

Je vais aller manger et je vais reprendre si j'ai encore un peu envie.
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: 5.40 b5 x86 et CreateWindowEx_()

Message par Fred »

Ce que tu peux essayer de faire, c'est de comparer les listing asm (/COMMENTED) entre les deux versions pour voir si il y a un probleme qqpart. Essaie aussi avec la beta 6, on ne sait jamais !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: 5.40 b5 x86 et CreateWindowEx_()

Message par Anonyme2 »

C'est la bêta 6.

Je vais déjà essayer de voir pourquoi je n'appelle pas les mêmes procédures, ensuite je vais voir avec l'asm si besoin.

J'ai aussi un bug qui arrive parfois (ce n'est arrivé que 4 ou 5 fois) avec un thread au démarrage, je me demande s'il n'y a pas un lien (avec la version 5.31 aussi)?

Le bug du thread est déroutant car j'ai ça :

Code : Tout sélectionner

Procedure PIM_OpenSplashScreen_Show(Valeur)
      Protected j, Police
      ;// Texte à afficher sur l'image
      Protected Texte$ = ""
      
      Texte$ = PIM_Threaded_Load_Resource_String(#String_VERDANA, MAC_MAKELANGID(#LANG_NEUTRAL, #SUBLANG_NEUTRAL))
      Police = LoadFont(#Font_Splas_Screen, Texte$, 20, #PB_Font_HighQuality)
      Texte$ = PIM_Threaded_Load_Resource_String(#Texte_SPLASH_LOADING, GLB_Langue_id)
      
      Repeat
            If IsImage(#Img_PIM_Loading) And IsGadget(#PIM_Loading) And StartDrawing(CanvasOutput(#PIM_Loading))
                  Box(0, 0, ImageWidth(#Img_PIM_Loading), ImageHeight(#Img_PIM_Loading), $FFFFFF)
                  DrawAlphaImage(ImageID(#Img_PIM_Loading), 0, 0)
                  DrawingMode(#PB_2DDrawing_Transparent)
                  If IsFont(#Font_Splas_Screen)
                        DrawingFont(Police)
                  EndIf
                  
                  Select j
                        Case 0 To 4
                              DrawText(20, 195, Texte$ + Space(j) + ".", $C18824)
                              If j = 4
                                    j = 0
                              Else
                                    j+1
                              EndIf
                  EndSelect
                  StopDrawing()
                  
            EndIf
            Delay(Valeur)
      ForEver
EndProcedure
Parfois ça bug sur

Code : Tout sélectionner

 DrawAlphaImage(ImageID(#Img_PIM_Loading), 0, 0)
en disant que l'image n'est pas initialisée, malgré les tests avant...
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: 5.40 b5 x86 et CreateWindowEx_()

Message par Anonyme2 »

Bon l'asm j'arrête pour l'instant

version 5.31 un peu plus de 260000 lignes et la 5.40 b6 un peu plus de 273000 lignes, rien que 13000 lignes d'écart, c'est rien 8O
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: 5.40 b5 x86 et CreateWindowEx_()

Message par Anonyme2 »

Fred, j'ai fini par trouver le bug.
D'abord c'est une erreur de ma part sur une API

Code : Tout sélectionner

SendMessage_(GLB_hToolBar_ContainerImage, #TB_SETPADDING, 0, ($FFFFFFFC00000000)| 3)
je ne sais pas pourquoi j'ai mis cette valeur, j'ai du faire un essai un jour car le code d'origine c'est celui-là

Code : Tout sélectionner

SendMessage_(GLB_hToolBar_ContainerImage, #TB_SETPADDING, 0, MAC_MAKELPARAM(0,-5))
Ensuite pas de problème avec la version 5.31 x86, voici le code asm

Code : Tout sélectionner

; SendMessage_(GLB_hToolBar_CopyPaste, #TB_SETPADDING, 0, ($FFFFFFFC00000000)| 3)
  PUSH   dword 3
  PUSH   dword 0
  PUSH   dword 1111
  PUSH   dword [v_GLB_hToolBar_CopyPaste]
  CALL  _SendMessageW@16
maintenant, le code avec la version 5.40 b6 x86 (tu as modifié quelque chose)

Code : Tout sélectionner

; SendMessage_(GLB_hToolBar_CopyPaste, #TB_SETPADDING, 0, ($FFFFFFFC00000000)| 3)
  PUSH   dword -4
  PUSH   dword 3
  PUSH   3
  XOR    eax,eax
  PUSH   eax
  MOV    eax,1111
  PUSH   eax
  MOV    eax,dword [v_GLB_hToolBar_CopyPaste]
  PUSH   eax
  CALL  _SendMessageW@16
j'ai corrigé mon code PB et ça fonctionne.

A toi la correction du code asm et contrôle de la taille des paramètres. :roll:

Voici les code asm 64 bits, identiques pour les deux versions.
5.31 x64

Code : Tout sélectionner

; SendMessage_(GLB_hToolBar_CopyPaste, #TB_SETPADDING, 0, ($FFFFFFFC00000000)| 3)
  SUB    rsp,8
  MOV    rax,-17179869181
  PUSH   rax
  PUSH   qword 0
  PUSH   qword 1111
  PUSH   qword [v_GLB_hToolBar_CopyPaste]
  POP    rcx
  POP    rdx
  POP    r8
  POP    r9
  SUB    rsp,32
  CALL   SendMessageW
  ADD    rsp,40
5.40 b6 x64

Code : Tout sélectionner

; SendMessage_(GLB_hToolBar_CopyPaste, #TB_SETPADDING, 0, ($FFFFFFFC00000000)| 3)
  SUB    rsp,8
  MOV    rax,-17179869181
  PUSH   rax
  PUSH   qword 0
  PUSH   qword 1111
  PUSH   qword [v_GLB_hToolBar_CopyPaste]
  POP    rcx
  POP    rdx
  POP    r8
  POP    r9
  SUB    rsp,32
  CALL   SendMessageW
  ADD    rsp,40
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: 5.40 b5 x86 et CreateWindowEx_()

Message par Fred »

Merci pour ta recherche, tu as mis en evidence une grosse regression. C'est corrigé pour la prochaine version.
Répondre