Page 1 sur 1
erreur asm : _Procedure-66151057
Publié : ven. 09/oct./2015 14:29
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)
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
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.
Un bug Fred ?
Re: erreur asm : _Procedure-66151057
Publié : ven. 09/oct./2015 17:03
par G-Rom
Tu récupère comment le contenu de ta datasection ?
Re: erreur asm : _Procedure-66151057
Publié : ven. 09/oct./2015 19:04
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
Re: erreur asm : _Procedure-66151057
Publié : ven. 09/oct./2015 20:05
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 ^^
Re: erreur asm : _Procedure-66151057
Publié : sam. 10/oct./2015 4:48
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

Re: erreur asm : _Procedure-66151057
Publié : sam. 10/oct./2015 7:13
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)
Re: erreur asm : _Procedure-66151057
Publié : sam. 10/oct./2015 7:36
par Fred
Effectivement, cette syntax n'est pas supportée, elle aurait du generer une erreur. Je vais corriger ca.
Re: erreur asm : _Procedure-66151057
Publié : sam. 10/oct./2015 9:11
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
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
Re: erreur asm : _Procedure-66151057
Publié : sam. 10/oct./2015 10:22
par Fred
Ca marcherait sur windows mais pas sur OS X par exemple, c'est pour ca que ce n'est pas supporté.
Re: erreur asm : _Procedure-66151057
Publié : sam. 10/oct./2015 10:47
par Anonyme2
Ok,
j'ai voulu passer par un module (car c'est mon wrapper gdiplus) mais les déclarations du type
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.
Re: erreur asm : _Procedure-66151057
Publié : sam. 10/oct./2015 10:54
par Fred
C'est quoi le probleme de passer par GetFunction() exactement ?
Re: erreur asm : _Procedure-66151057
Publié : sam. 10/oct./2015 11:02
par Anonyme2
Fred a écrit :C'est quoi le probleme de passer par GetFunction() exactement ?
Le problème c'est moi
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
Sinon, je peux mettre directement GetFunction() en datasection ?