Un peu d'aide pour ma DLL
Publié : lun. 03/avr./2006 20:47
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.
J'ai donc utilisé ce code (Merci Erix14) comme source :
J'en est fait deux procedures, une pour le Nom et l'autre pour la Taille, que voici :
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 :
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.
Comment contourné le problême, ai-je oublié quelques choses ?
Pourquoi cela fonctionne t-il en tant que procedure et pas dans une DLL ?
Si vous avez quelques réponces !
Merci d'avance !
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.

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()
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 ?

Pourquoi cela fonctionne t-il en tant que procedure et pas dans une DLL ?
Si vous avez quelques réponces !
Merci d'avance !