erreur asm : _Procedure-66151057

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

erreur asm : _Procedure-66151057

Message par Anonyme2 »

J'ai voulu mettre en datasection l'adresse de certaines fonctions de Gdi+ issuent des imports mais j'ai des erreurs asm.

Code : Tout sélectionner

DataSection 
     GdipDeleteFont:
     Data.i @GdipDeleteFont()  
     
     GdipDeleteEffect:
    Data.i @GdipDeleteEffect()
EndDataSection
on récupère ces adresses sans problème exemple avec une map

Code : Tout sélectionner

Procedure Gdiplus_Init_CleanUp()
      ;// utilisée par le wrapper pour destruction des objects Gdi+
      ;// mémorise les adresses des fonctions de destruction des éléments Gdi+
      GDIp_DelProc(Str(#Type_Token))\type = #Type_Token
      GDIp_DelProc(Str(#Type_Token))\adresse_Proc = @GdiplusShutdown()
      
      GDIp_DelProc(Str(#Type_Brush))\type = #Type_Brush
      GDIp_DelProc(Str(#Type_Brush))\adresse_Proc = @GdipDeleteBrush()
      
      GDIp_DelProc(Str(#Type_CachedBitmap))\type = #Type_CachedBitmap
      GDIp_DelProc(Str(#Type_CachedBitmap))\adresse_Proc = @GdipDeleteCachedBitmap()
      
      GDIp_DelProc(Str(#Type_CustomLineCap))\type = #Type_CustomLineCap
      GDIp_DelProc(Str(#Type_CustomLineCap))\adresse_Proc = @GdipDeleteCustomLineCap()
      
      GDIp_DelProc(Str(#Type_Effect))\type = #Type_Effect
      GDIp_DelProc(Str(#Type_Effect))\adresse_Proc = @GdipDeleteEffect()
      
      GDIp_DelProc(Str(#Type_Font))\type = #Type_Font
      GDIp_DelProc(Str(#Type_Font))\adresse_Proc = @GdipDeleteFont()
      
      GDIp_DelProc(Str(#Type_FontFamily))\type = #Type_FontFamily
      GDIp_DelProc(Str(#Type_FontFamily))\adresse_Proc = @GdipDeleteFontFamily()
      
      GDIp_DelProc(Str(#Type_Gfx))\type = #Type_Gfx
      GDIp_DelProc(Str(#Type_Gfx))\adresse_Proc = @GdipDeleteGraphics()
      
      GDIp_DelProc(Str(#Type_Image))\type = #Type_Image
      GDIp_DelProc(Str(#Type_Image))\adresse_Proc = @GdipDisposeImage()
      
      GDIp_DelProc(Str(#Type_imageattributes))\type = #Type_imageattributes
      GDIp_DelProc(Str(#Type_imageattributes))\adresse_Proc = @GdipDisposeimageattributes()
      
      GDIp_DelProc(Str(#Type_Matrix))\type = #Type_Matrix
      GDIp_DelProc(Str(#Type_Matrix))\adresse_Proc = @GdipDeleteMatrix()
      
      GDIp_DelProc(Str(#Type_Memory))\type = #Type_Memory
      GDIp_DelProc(Str(#Type_Memory))\adresse_Proc = @GdipFree()
      
      GDIp_DelProc(Str(#Type_Path))\type = #Type_Path
      GDIp_DelProc(Str(#Type_Path))\adresse_Proc = @GdipDeletePath()
      
      GDIp_DelProc(Str(#Type_PathIter))\type = #Type_PathIter
      GDIp_DelProc(Str(#Type_PathIter))\adresse_Proc = @GdipDeletePathIter()
      
      GDIp_DelProc(Str(#Type_Pen))\type = #Type_Pen
      GDIp_DelProc(Str(#Type_Pen))\adresse_Proc = @GdipDeletePen()
      
      GDIp_DelProc(Str(#Type_Region))\type = #Type_Region
      GDIp_DelProc(Str(#Type_Region))\adresse_Proc = @GdipDeleteRegion()
      
      GDIp_DelProc(Str(#Type_StringFormat))\type = #Type_StringFormat
      GDIp_DelProc(Str(#Type_StringFormat))\adresse_Proc = @GdipDeleteStringFormat()
EndProcedure
mais en datasection j'ai ce code asm par exemple pour une des fonctions (ici deletestringformat)

Code : Tout sélectionner

l_gdipdeletestringformat:
  dq    _Procedure-66151057
un joli signe - après le mot procedure (il n'y est pas toujours il me semble).

la fonction est déclarée comme ceci

Code : Tout sélectionner

extrn GdipDeleteStringFormat
elle est utilisée ailleurs comme ici

Code : Tout sélectionner

; GDIp_DelProc(Str(#Type_StringFormat))\adresse_Proc = @GdipDeleteStringFormat()
  MOV    rax,GdipDeleteStringFormat
on a une erreur sur le symbole _Procedure qui n'existe pas. L'erreur arrive aussi bien en 32 et 64 bits.
J'ai changé de label mais ça ne change rien.
Je ne sais pas si j'ai oublié quelque chose mais j'aimerais bien que ça marche. :D

Un bug Fred ?
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: erreur asm : _Procedure-66151057

Message par G-Rom »

Tu récupère comment le contenu de ta datasection ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: erreur asm : _Procedure-66151057

Message par Anonyme2 »

*pt = ?GdipDeleteFont par exemple, mais j'ai l'erreur sans avoir essayé de récupérer une valeur, j'ai mis en datasection et compilé.

En fait, je voudrais l'utiliser avec un prototype, ce que je fais avec une map mais j'aimerais ne pas utiliser de map en global.

Pour l'instant cela fonctionne avec la map et le prototype et la procedure Gdiplus_Init_CleanUp() que j'ai posté.

Code : Tout sélectionner

;- NewMap GDIp_DelProc.GDIp_DelProc(), utilisée par le wrapper pour destruction des objects Gdi+
Global NewMap GDIp_DelProc.GDIp_DelProc()
Prototype.i Gdiplus_DelObjects(*Gdip_object)  ;// utilisé par le wrapper pour destruction des objects Gdi+
j'ai ces procedures qui fonctionnent bien, c'est un truc qui ressemble à une fonction destructor mais qui termine le code

Code : Tout sélectionner

;- Enumeration #Gdiplus_type, utilisé par le wrapper pour destruction des objects Gdi+
Enumeration 1
      #Gdiplus_type_Start = #PB_Compiler_EnumerationValue
      #Type_Token =  #Gdiplus_type_Start  ;// laisser #Type_Token au début de l'énumération sinon crash
      #Type_Brush
      #Type_CachedBitmap
      #Type_CustomLineCap
      #Type_Effect
      #Type_Font
      #Type_FontFamily
      #Type_Gfx
      #Type_Image
      #Type_imageattributes
      #Type_Matrix
      #Type_Memory
      #Type_Path
      #Type_PathIter
      #Type_Pen
      #Type_Region
      #Type_StringFormat
      #Gdiplus_type_End = #PB_Compiler_EnumerationValue - 1
EndEnumeration

Enumeration 1
      #Window_Start = #PB_Compiler_EnumerationValue
      #MainWindow   = #Window_Start
      #Window_End   = #PB_Compiler_EnumerationValue - 1
EndEnumeration

Enumeration
      #Gadget_Start = #PB_Compiler_EnumerationValue
      #CanvasGadget_Img_origine = #Gadget_Start
      #CanvasGadget_Img_gamma
      #TextGadget1
      #TextGadget2
      #TextGadget_Gamma
      #TrackBarGadget_Gamma
      #Gadget_End   = #PB_Compiler_EnumerationValue - 1
EndEnumeration

Enumeration
      #Font_Start = #PB_Compiler_EnumerationValue
      #Font = #Font_Start
      #Font_End   = #PB_Compiler_EnumerationValue - 1
EndEnumeration
  
  Procedure.i Gdiplus_GetDelProc(type)
      ;// utilisée par le wrapper pour destruction des objects Gdi+
      ;// retrouve l'adresse de la procedure de destruction de l'objet Gdi+ en fonction du paramètre type
      Select type
            Case #Gdiplus_type_Start To #Gdiplus_type_End
                  ProcedureReturn GDIp_DelProc(Str(type))\adresse_Proc
      EndSelect
      ProcedureReturn #Null
EndProcedure

Procedure CleanUpGdiplus_Object(List GDIp_Object.GDIp_Object(), *item)
      ;// détruit l'élément *item Gdi+ et le supprime de la liste
      
      ;// variable utilisé avec le prototype pour l'appel des fonctions de destruction des objets Gdi+
      Protected  *Gdiplus_Del.Gdiplus_DelObjects
      
      If *item
            ForEach GDIp_Object()
                  If GDIp_Object()\id = *item
                        *Gdiplus_Del = Gdiplus_GetDelProc(GDIp_Object()\type)
                        If *Gdiplus_Del
                              *Gdiplus_Del(GDIp_Object()\id)
                              DeleteElement(GDIp_Object())
                              Break
                        EndIf
                  EndIf
            Next
      EndIf
EndProcedure

Procedure CleanUp_And_Stop(List GDIp_Object.GDIp_Object())
      ;// détruit les éléments Gdi+ contenu dans la liste chainée GDIp_Object
      ;// termine le programme en cours
      
      ;// variable utilisée avec le prototype pour l'appel des fonctions de destruction des objets Gdi+
      Protected  *Gdiplus_Del.Gdiplus_DelObjects
      ;// compteur de boucle
      Protected i
      
      ;// on trie la liste pour que #Type_Token se retrouve à la fin pour être effacé en dernier
      ;// sinon les éléments Gdi+ sont invalides
      SortStructuredList(GDIp_Object(), #PB_Sort_Descending, OffsetOf(GDIp_Object\type),  #PB_Integer)
      
      ;// on détruit les éléments GDI+
      ForEach GDIp_Object()
            *Gdiplus_Del = Gdiplus_GetDelProc(GDIp_Object()\type)
            If *Gdiplus_Del
                  *Gdiplus_Del(GDIp_Object()\id)
            EndIf
      Next
      ;// on détruit les éléments PB, le programme se termine
      For i = #Gadget_Start To #Gadget_End
            If IsGadget(i) : FreeGadget(i) : EndIf
      Next
      
      For i = #Window_Start To #Window_End
            If IsWindow(i) : CloseWindow(i) : EndIf
      Next
      
      ;// fin du programme
      End
EndProcedure
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: erreur asm : _Procedure-66151057

Message par G-Rom »

*pt = ?GdipDeleteFont
C'est un pointeur vers le label , pas la fonction.

Code : Tout sélectionner

Procedure Foo():EndProcedure

Debug ?Foo
Debug PeekI(?Foo)
Debug @Foo()

DataSection
  Foo:
  Data.i @Foo()  
EndDataSection
mais j'ai l'erreur sans avoir essayé de récupérer une valeur, j'ai mis en datasection et compilé.
La c'est autre chose, peu être un symbole manquant , ou que sais je ...
tu as un code qui reproduit le plantage ?
En gros, tu voudrais "mappé" faire le lien entre une lib , et des prototypes PB , utilise la librairie "Library" pour récupéré l'adresse au lieu de la stockée ?
ou plus simple faire un code C pour une userlib PB, comme ca pas de problème de gymnastique périlleuse ^^
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: erreur asm : _Procedure-66151057

Message par Anonyme2 »

G-Rom a écrit :
*pt = ?GdipDeleteFont
C'est un pointeur vers le label , pas la fonction.

Code : Tout sélectionner

Procedure Foo():EndProcedure

Debug ?Foo
Debug PeekI(?Foo)
Debug @Foo()

DataSection
  Foo:
  Data.i @Foo()  
EndDataSection
Oui G-Rom, je sais cela.

Mon problème est juste qu'il y a un problème de déclaration dans la section assembleur pour la fonction dans le cas des imports.
J'ai pensé à une ou deux choses pour essayer de contourner.

G-Rom a écrit :
*pt = ?GdipDeleteFont
mais j'ai l'erreur sans avoir essayé de récupérer une valeur, j'ai mis en datasection et compilé.
La c'est autre chose, peu être un symbole manquant , ou que sais je ...
tu as un code qui reproduit le plantage ?
En gros, tu voudrais "mappé" faire le lien entre une lib , et des prototypes PB , utilise la librairie "Library" pour récupéré l'adresse au lieu de la stockée ?
ou plus simple faire un code C pour une userlib PB, comme ca pas de problème de gymnastique périlleuse ^^
Le C ce n'est pas pour moi, je n'y connais rien mis à part ce que j'ai lu d'une doc qu'un collègue m'a passé.

J'aimerais éviter d'utiliser la librairie "Library" pour faire cela.

Merci :wink:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: erreur asm : _Procedure-66151057

Message par Anonyme2 »

Finalement j'ai écrit en assembleur PB les adresses et maintenant c'est OK mais ça reste un bug
Je vais faire mes tests avec la datasection

Code : Tout sélectionner

EnableASM
      DataSection
            CompilerSelect #PB_Compiler_Processor
                  CompilerCase #PB_Processor_x86
                        GdipDeleteBrush:
                        ! dd _GdipDeleteBrush@4
                        GdipDeleteCachedBitmap:
                        ! dd _GdipDeleteCachedBitmap@4
                        GdipDeleteCustomLineCap:
                        ! dd _GdipDeleteCustomLineCap@4
                        GdipDeleteEffect:
                        ! dd _GdipDeleteEffect@4
                        GdipDeleteFont:
                        ! dd _GdipDeleteFont@4
                        GdipDeleteFontFamily:
                        ! dd _GdipDeleteFontFamily@4
                        GdipDeleteGraphics:
                        ! dd _GdipDeleteGraphics@4
                        GdipDeleteMatrix:
                        ! dd _GdipDeleteMatrix@4
                        GdipDeletePath:
                        ! dd _GdipDeletePath@4
                        GdipDeletePathIter:
                        ! dd _GdipDeletePathIter@4
                        GdipDeletePen:
                        ! dd _GdipDeletePen@4
                        GdipDeleteRegion:
                        ! dd _GdipDeleteRegion@4
                        GdipDeleteStringFormat:
                        ! dd _GdipDeleteStringFormat@4
                        GdipDisposeImage:
                        ! dd _GdipDisposeImage@4
                        GdipDisposeImageAttributes:
                        ! dd _GdipDisposeImageAttributes@4
                        GdipFree:
                        ! dd _GdipFree@4
                        GdiplusShutdown:
                        ! dd _GdiplusShutdown@4
                        
                  CompilerCase #PB_Processor_x64
                        GdipDeleteBrush:
                        ! dq GdipDeleteBrush
                        GdipDeleteCachedBitmap:
                        ! dq GdipDeleteCachedBitmap
                        GdipDeleteCustomLineCap:
                        ! dq GdipDeleteCustomLineCap
                        GdipDeleteEffect:
                        ! dq GdipDeleteEffect
                        GdipDeleteFont:
                        ! dq GdipDeleteFont
                        GdipDeleteFontFamily:
                        ! dq GdipDeleteFontFamily
                        GdipDeleteGraphics:
                        ! dq GdipDeleteGraphics
                        GdipDeleteMatrix:
                        ! dq GdipDeleteMatrix
                        GdipDeletePath:
                        ! dq GdipDeletePath
                        GdipDeletePathIter:
                        ! dq GdipDeletePathIter
                        GdipDeletePen:
                        ! dq GdipDeletePen
                        GdipDeleteRegion:
                        ! dq GdipDeleteRegion
                        GdipDeleteStringFormat:
                        ! dq GdipDeleteStringFormat
                        GdipDisposeImage:
                        ! dq GdipDisposeImage
                        GdipDisposeImageAttributes:
                        ! dq GdipDisposeImageAttributes
                        GdipFree:
                        ! dq GdipFree
                        GdiplusShutdown:
                        ! dq GdiplusShutdown
            CompilerEndSelect
      EndDataSection
DisableASM

Debug PeekI(?GdipDeleteStringFormat)
Debug PeekI(?GdipDisposeImage)
Debug PeekI(?GdipDisposeImageAttributes)
Debug PeekI(?GdipFree)
Debug PeekI(?GdiplusShutdown)
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: erreur asm : _Procedure-66151057

Message par Fred »

Effectivement, cette syntax n'est pas supportée, elle aurait du generer une erreur. Je vais corriger ca.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: erreur asm : _Procedure-66151057

Message par Anonyme2 »

Fred a écrit :Effectivement, cette syntax n'est pas supportée, elle aurait du generer une erreur. Je vais corriger ca.
Fred,
j'espère que l'on va pouvoir le faire à la manière PB sans asm car je n'ai pas cette impression en te lisant :roll:
Ca marche bien avec les adresses en data

Code : Tout sélectionner

Procedure.i Gdiplus_GetDelProc(type)
      ;// **********************************************************************************************************
      ;// Retrouve l'adresse des fonctions de destruction des objets Gdi+ en fonction du paramètre type
      ;// Finds address of gdi+ destruction objects functions according type parameter 
      ;// **********************************************************************************************************
      Protected *add
      
      Select type
            Case #Gdiplus_type_Start To #Gdiplus_type_End
                  *add = PeekI(?Gdip_Del_BaseAdress + (SizeOf(integer) * (type - #Gdiplus_type_Start)))
      EndSelect
      ProcedureReturn *add
EndProcedure
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: erreur asm : _Procedure-66151057

Message par Fred »

Ca marcherait sur windows mais pas sur OS X par exemple, c'est pour ca que ce n'est pas supporté.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: erreur asm : _Procedure-66151057

Message par Anonyme2 »

Ok,

j'ai voulu passer par un module (car c'est mon wrapper gdiplus) mais les déclarations du type

Code : Tout sélectionner

extrn  _GdipDeleteBrush@4
n'existent pas car du coup j'ai supprimé la map qui utilisait ces adresses (elles étaient donc déclarées en asm).

Je peux mettre un ! extrn _GdipDeleteBrush@4 etc. mais cela reste du bricolage, je vais réfléchir un peu car j'étais assez satisfait d'utiliser les datas avec les adresses.
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: erreur asm : _Procedure-66151057

Message par Fred »

C'est quoi le probleme de passer par GetFunction() exactement ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: erreur asm : _Procedure-66151057

Message par Anonyme2 »

Fred a écrit :C'est quoi le probleme de passer par GetFunction() exactement ?
Le problème c'est moi :mrgreen:

Si j'utilise les imports c'est pour ne pas utiliser GetFunction() et c'est assez conforme à la doc
Les fonctions importées remplacent avantageusement les commandes OpenLibrary()/CallFunction(): la vérification du type, le nombre de paramètres sont validés par le compilateur. De plus, contrairement à CallFunction(), une fonction importée peut gérer les types 'double', 'float' et 'quad' sans aucun problème.
Bon, je sais il y a les prototypes et pseudotypes :D

Sinon, je peux mettre directement GetFunction() en datasection ?
Répondre