Page 1 sur 1

Un peu d'aide pour ma DLL

Publié : lun. 03/avr./2006 20:47
par Ulix
Bonjour a tous,

Voilà mon problême. Ayant besoin du nom est de la taille de la police en cours d'utilisation, j'ai demandé si quelqu'un savez comment faire.
Encore merci a tous ceux qui m'on répondu. :lol:

J'ai donc utilisé ce code (Merci Erix14) comme source :

Code : Tout sélectionner

hDC = StartDrawing(WindowOutput(0))
               currentFont = SendMessage_(GadgetID(1),#WM_GETFONT,0,0)
               GetObject_(currentFont, SizeOf(LOGFONT), @lf.LOGFONT)
               faceName$ = PeekS(@lf\lfFacename)
               faceHeight.l = Round(-lf\lfHeight*72/GetDeviceCaps_(hDC,#LOGPIXELSY),1)
               SetGadgetText(0,faceName$+" : "+Str(faceHeight))
               ;/
               hDC_Gadget = GetDC_(GadgetID(1))
               PrevMapMode = SetMapMode_(hDC_Gadget,#MM_TEXT)
               GetTextMetrics_(hDC_Gadget,tm.TEXTMETRIC)
               If PrevMapMode : SetMapMode_(hDC_Gadget,PrevMapMode) : EndIf
               SetGadgetText(1,"Taille : "+Str(tm\tmHeight)+" pixels")
               ReleaseDC_(GadgetID(1),hDC_Gadget)
               
               
               ;/ confirmation du résultat
               ;hFont = LoadFont(1,faceName$,faceHeight)
               SendMessage_(GadgetID(2),#WM_SETFONT,hFont,#True)
               			

SetGadgetText(2,"LoadFont(1,"+Chr(34)+faceName$+Chr(34)+","+Str(faceHeight)+")")
               StopDrawing() 

J'en est fait deux procedures, une pour le Nom et l'autre pour la Taille, que voici :

Code : Tout sélectionner


Procedure.s GetFontName(NumGadget.l, NumFenetre.l)
; renvoie le nom de la police utilisée pour les gadgets
CurrentFont.l = SendMessage_(GadgetID(NumGadget),#WM_GETFONT,0,0)
If CurrentFont

               GetObject_(CurrentFont, SizeOf(LOGFONT), @lf.LOGFONT);, FontID(#Font1)
               ProcedureReturn PeekS(@lf\lfFacename);faceName$
               
               
 Else : ProcedureReturn "":EndIf
 EndProcedure


Procedure GetFontSize(NumGadget.l, NumFenetre.l)
; renvoie la taille de la police utilisée pour les gadgets
CurrentFont.l = SendMessage_(GadgetID(NumGadget),#WM_GETFONT,0,0)
If CurrentFont

               GetObject_(CurrentFont, SizeOf(LOGFONT), @lf.LOGFONT)
               faceHeight.l = 

Znt(-lf\lfHeight*72/GetDeviceCaps_(GetDC_(WindowID(NumFenetre)),#LOGPIXELSY))
              
               ProcedureReturn faceHeight
               
               
 Else : ProcedureReturn 0 :EndIf
 EndProcedure


C'est deux procedure fonctionnent très bien, (vous pouvez toujours me subgére des améliorations, je suis toujours prenneur).
Mon problême débute avec leurs intégration dans une DLL.
Ma DLL :

Code : Tout sélectionner


;renvoi la taille de la police : ex. Arial taille : 10
DeclareDLL GetFontSize(NumGadget.l,Numfenetre.l)

;renvoi le Nom de la police : ex. Arial 
DeclareDLL GetFontName(NumGadget.l, NumFenetre.l)



ProcedureDLL GetFontSize(NumGadget.l, Numfenetre.l)
; Renvoie la Taille de la police utilisée pour les gadgets
hDC.l = StartDrawing(WindowOutput(Numfenetre))
If hDC
               CurrentFont.l = SendMessage_(GadgetID(NumGadget),#WM_GETFONT,0,0) ;  <=== Ici problême 
               MessageRequester("Message ","CurrentFont = "+Str(CurrentFont),0)                ; pour 

voir
               GetObject_(CurrentFont, SizeOf(LOGFONT), @lf.LOGFONT)
               FontTaille.l = Int(-lf\lfHeight*72/GetDeviceCaps_(hDC, #LOGPIXELSY))
               StopDrawing()
               ProcedureReturn FontTaille

 Else : ProcedureReturn 0 : EndIf
EndProcedure

ProcedureDLL GetFontName(NumGadget.l, NumFenetre.l)
; Renvoie le nom de la police utilisée pour les gadgets

;MessageRequester("Message ","NumGadget= "+Str(NumGadget),0)     ;Ok
;MessageRequester("Message ","NumFenetre= "+Str(NumFenetre),0)     ;Ok

hDC.l = StartDrawing(WindowOutput(NumFenetre))
If hDC
               CurrentFont.l = SendMessage_(GadgetID(NumGadget),#WM_GETFONT,0,0) ;  <=== Ici problême 
               MessageRequester("Message ","CurrentFont = "+Str(CurrentFont),0)                ; pour 

voir
               GetObject_(CurrentFont, SizeOf(LOGFONT), @lf.LOGFONT)
               ;faceName$ = PeekS(@lf\lfFacename)
               StopDrawing()
           
               ProcedureReturn @lf\lfFacename ;revoie le pointeur
        
 Else : ProcedureReturn 0:EndIf
 EndProcedure

Apparement, c'est le sendMessage qui ne fonctionne pas dans la DLL, alors que dans la procedure normal

il fonctionne. Qu'elle est l'argument qui pose problême :
Est-ce : GadgetID(NumGadget)? Le numero du gadget est bien transmit,

Le Sendmessage ne peut-il pas être employé dans une DLL ?
Un peu d'aide serait la bien venue !


Suit le programme pour testé : les deux procedures (en interne) et les deux procedureDLL.

Code : Tout sélectionner



Enumeration
#f1=1:#Librairie
#Bouton1:#Bouton2
EndEnumeration


If OpenLibrary(#Librairie, "Dll de Test" )=0
		MessageRequester("Erreur...","Dll non trouver ?",0):EndIf


Procedure GetFontSize(NumGadget.l, NumFenetre.l)
; Renvoie la taille de la police utilisé pour les gadgets
CurrentFont.l = SendMessage_(GadgetID(NumGadget),#WM_GETFONT,0,0)
If CurrentFont
               GetObject_(CurrentFont, SizeOf(LOGFONT), @lf.LOGFONT)
               faceHeight.l = 

Int(-lf\lfHeight*72/GetDeviceCaps_(GetDC_(WindowID(NumFenetre)),#LOGPIXELSY))
               ProcedureReturn faceHeight
               
 Else : ProcedureReturn 0 :EndIf
 EndProcedure
 
Procedure.s GetFontName(NumGadget.l, NumFenetre.l)
; Renvoie le nom de la police utilisé pour les gadgets
CurrentFont.l = SendMessage_(GadgetID(NumGadget),#WM_GETFONT,0,0)
If CurrentFont
               GetObject_(CurrentFont, SizeOf(LOGFONT), @lf.LOGFONT)
               ProcedureReturn PeekS(@lf\lfFacename)
    
 Else : ProcedureReturn "":EndIf
 EndProcedure


If OpenWindow(#f1,0,0,300,200,"Test DLL",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(#f1))
          ButtonGadget(#Bouton1, 30,   50,  100,  30,  "Test Dll")
          ButtonGadget(#Bouton2, 30, 100,  100,  30,  "Test Procedure")
EndIf

               
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
          
          Select EventGadget()
          Case #Bouton1
          
                         Result=CallFunction(#Librairie, "GetFontSize", #Bouton1, #f1);appelle une DLL
                         Debug "Retour de la DLL Taille : "+Str(Result) ; pour vérifier
                         If Result		;appel réussi
                                   Taille.b=result
                                   Debug "Procedure interne - Taille : " +Str(Taille)
                         EndIf
                         
                         Result=CallFunction(#Librairie, "GetFontName", #Bouton1, #f1);appelle une DLL
                         Debug "Retour de la DLL Nom : "+Str(Result); pour vérifier
                         If Result>0    ;appel réussi
                                   Nom$=PeekS(Result)
                                   Debug "Procedure Dll - Nom : " +Nom$
                         EndIf
                         
          Case #Bouton2
                         Debug "Procedure interne - Nom : " +GetFontName(#Bouton1, #f1)
                         Debug "Procedure interne - Taille : " +Str(GetFontSize(#Bouton1, #f1))
                    
          EndSelect

Case #PB_Event_CloseWindow
          Quit = #True
EndSelect
Until Quit 
End
EndIf


Comment contourné le problême, ai-je oublié quelques choses ? :oops:
Pourquoi cela fonctionne t-il en tant que procedure et pas dans une DLL ?
Si vous avez quelques réponces !

Merci d'avance !

Publié : lun. 03/avr./2006 22:14
par nico
J'ai fais quelques essais, et apparemment je charge bien la dll mais impossible d'appeler une fonction?

Publié : lun. 03/avr./2006 22:21
par nico
Effectivement, je n'arrive pas à obtenir la fonction; j'ai essayé avec GetFunction et il me retourne toujours 0.

Publié : mar. 04/avr./2006 8:50
par Ulix
Merci Nico, de t'être intéréssé a mon problême !

J'avais placé quelque messageBox pour pisté l'erreur, les numeros de fenetre et de gadget sont bien transmis a la DLL. Apparement c'est le sendMessage qui pose problême.
Je pensé que tout code qui fonctionne dans une procedure normal, pouvait être utilisé dans une DLL !
Pourquoi un tel comportement ? Qu'es-ce que j'ai mal fais ?
(Pour ma DLL, je peut me passé de ces deux fonctions, elle fonctionnent très bien comme procedure interne).

Mais pourquoi cette différence de comportement ?
Un bug ? Je n'ose y songé ! Je laisse ma question en suspens, si quelqu'un a une explication, elle sera la bienvenue

A+

Publié : mar. 04/avr./2006 11:09
par Gillou
Bonjour Ulix, ce n'est pas le SendMessage qui ne marche pas c'est le gadgetid()

essai ça (chez moi ça marche en dll) :
Procedure.l DesktopOutput()
    Mem = AllocateMemory (1024)
     PokeL (Mem, 1)
     ProcedureReturn Mem
EndProcedure

ProcedureDLL GetGadgetFontHeight( GadgetID , Mode) ; Mode = 1 in Pixels, Mode = 0 in FontSize
   hDC = StartDrawing (DesktopOutput())
        If Mode = 0
           currentFont = SendMessage_ ( GadgetID , #WM_GETFONT ,0,0)
            GetObject_ (currentFont, SizeOf(LOGFONT), @lf.LOGFONT)
           faceHeight.l = Round (-lf\lfHeight*72/ GetDeviceCaps_ (hDC, #LOGPIXELSY ),1)
        ElseIf Mode = 1
           hDC_Gadget = GetDC_ ( GadgetID )
           PrevMapMode = SetMapMode_ (hDC_Gadget, #MM_TEXT )
            GetTextMetrics_ (hDC_Gadget,tm.TEXTMETRIC)
            If PrevMapMode : SetMapMode_ (hDC_Gadget,PrevMapMode) : EndIf
           faceHeight = tm\tmHeight
            ReleaseDC_ ( GadgetID ,hDC_Gadget)
        EndIf
    StopDrawing ()
    ProcedureReturn faceheight
EndProcedure

ProcedureDLL.s GetGadgetFontName( GadgetID )
    hDC = StartDrawing (DesktopOutput())
        currentFont = SendMessage_ ( GadgetID , #WM_GETFONT ,0,0)
         GetObject_ (currentFont, SizeOf(LOGFONT), @lf.LOGFONT)
        faceName$ = PeekS (@lf\lfFacename)
     StopDrawing ()
     ProcedureReturn facename$
EndProcedure

Publié : mar. 04/avr./2006 20:55
par Ulix
Merci Gillou

Je vais testé ça, et essayais de comprendre le code.
Merci beaucoup :lol:

A+

Publié : mer. 05/avr./2006 8:57
par Ulix
Encore moi,

Juste pour dire que c'est parfait, d'ailleur Gillou tu pourrais proposé a Droopy de les rajouté dans sa lib.

Et pourquoi pas aussi en créé quelque autres :


GetFontSize() ;renvoi la taille de la police en cours (non lié a un gadget)
GetFontName() ;renvoi le nom de la police en cours (non lié a un gadget)

En tout cas merci de ton aide ! :lol: