Page 1 sur 2
fonction Import -> Erreur du Linker
Publié : mar. 12/juil./2016 14:15
par JohnJohnsonSHERMAN
Tout à l'heure, j'ai essayé d'exécuter l'exemple de PB sur la fonction Import (j'avais besoin d'importer des fonctions depuis une lib pour gérer un robot), le probléme c'est que lors de la compilation, j'ai une erreur du linker :
Code de l'exemple de PB :
Code : Tout sélectionner
Import "User32.lib"
; Pas besoin d'utiliser 'As' car PureBasic préfixe la fonction correctement
; Nous définissons également le paramètre 'Options' comme facultatif, avec une valeur par défaut de 0 (quand il est omis)
;
MessageBoxA(Fenetre.i, Corps$, Titre$, Options.i = 0)
; Cette fois PureBasic ne peut pas se débrouiller tout seul, car le
; nom de la fonction n'est pas le même que celui utilisé par le symbole
;
BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "_MessageBoxA@16"
EndImport
MessageBoxA(0, "Salut", "le Monde") ; Nous ne précisons pas les options
BoiteDeMessage(0, "Salut", "le Monde 2", 0)
Erreur obtenue :
---------------------------
PureBasic - Linker error
---------------------------
POLINK: error: Unresolved external symbol '_MessageBoxA@16'.
POLINK: fatal error: 1 unresolved external(s).
---------------------------
OK
---------------------------
Je suis sous Windows 10 x64, PB 5.42 LTS (x64)... c'est quand même bizarre comme probléme non? Une erreur dans un exemple de PB !
Re: fonction Import -> Erreur du Linker
Publié : mar. 12/juil./2016 14:54
par Ar-S
tu as décoché l'unicode ?
Chez moi en 5.42 x86 ça marche sans unicode.
Avec unicode les boites s'affichent aussi mais le texte s'affiche incorrectement.
Si tu es en x64 utilise importC au lieu de import pour voir
Re: fonction Import -> Erreur du Linker
Publié : mar. 12/juil./2016 15:01
par Fred
L'exemple n'est fonctionnel que sur Windows x86, en ascii, ce qui n'est pas normal pour un exemple de la doc. Je vais le modifier.
Re: fonction Import -> Erreur du Linker
Publié : mar. 12/juil./2016 15:29
par comtois
Désolé pour le hors sujet, mais tant qu'à reprendre un exemple faudrait jeter un oeil sur celui-ci "PureBasic\Examples\Sources - Advanced\Atomic Web Server"
Apparemment il date un peu, avec les nouvelles possibilités de PureBasic y'aurait moyen de l'arranger un peu
Voir les critiques
ici
Re: fonction Import -> Erreur du Linker
Publié : mar. 12/juil./2016 17:12
par Mesa
Je fais des modifs sur la doc dû au compilo unicode only, ya beaucoup d'exemples à revoir et celui là m'a échappé.
Mesa.
Re: fonction Import -> Erreur du Linker
Publié : mar. 12/juil./2016 17:24
par JohnJohnsonSHERMAN
Du coup, on fait comment en x64, unicode?
Re: fonction Import -> Erreur du Linker
Publié : mar. 12/juil./2016 18:41
par Zorro
JohnJohnsonSHERMAN a écrit :Du coup, on fait comment en x64, unicode?
comme ça !
Code : Tout sélectionner
Import "User32.lib"
; Pas besoin d'utiliser 'As' car PureBasic préfixe la fonction correctement
; Nous définissons également le paramètre 'Options' comme facultatif, avec une valeur par défaut de 0 (quand il est omis)
;
MessageBoxA(Fenetre.i, Corps$, Titre$, Options.i = 0)
; Cette fois PureBasic ne peut pas se débrouiller tout seul, car le
; nom de la fonction n'est pas le même que celui utilisé par le symbole
;
BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "_MessageBoxA@16"
EndImport
Declare.s makeutf8text(text.s)
MessageBoxA(0, MakeUTF8Text("Salut"), MakeUTF8Text("le Monde")) ; Nous ne précisons pas les options
BoiteDeMessage(0, MakeUTF8Text("Salut"),MakeUTF8Text("le Monde 2"), 0)
Procedure.s MakeUTF8Text(Text.s)
Static Buffer
Buffer = UTF8(Text.s)
PokeS(@buffer, text.s, -1, #PB_UTF8)
sortie$=peeks(@buffer)
ProcedureReturn sortie$
EndProcedure
ps: faudrai inclure cette fonction
dans Purebasic .... on a pas fini de galerer avec l'unicod ....
Re: fonction Import -> Erreur du Linker
Publié : mer. 13/juil./2016 8:43
par Fred
Autant utilser les API unicode si tu compiles en unicode, je ne vois pas ou est la galere:
Code : Tout sélectionner
Import "User32.lib"
; Pas besoin d'utiliser 'As' car PureBasic préfixe la fonction correctement
; Nous définissons également le paramètre 'Options' comme facultatif, avec une valeur par défaut de 0 (quand il est omis)
;
MessageBoxW(Fenetre.i, Corps$, Titre$, Options.i = 0)
; Cette fois PureBasic ne peut pas se débrouiller tout seul, car le
; nom de la fonction n'est pas le même que celui utilisé par le symbole
;
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "MessageBoxW"
CompilerElse
BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "_MessageBoxW@16"
CompilerEndIf
EndImport
MessageBoxW(0, "Salut", "le Monde") ; Nous ne précisons pas les options
BoiteDeMessage(0, "Salut", "le Monde 2", 0)
Ou si tu veux pour une raison inconnue continuer à utiliser à utiliser l'appel ASCII, les pseudotypes sont la pour t'aider
Code : Tout sélectionner
Import "User32.lib"
; Pas besoin d'utiliser 'As' car PureBasic préfixe la fonction correctement
; Nous définissons également le paramètre 'Options' comme facultatif, avec une valeur par défaut de 0 (quand il est omis)
;
MessageBoxA(Fenetre.i, Corps.p-ascii, Titre.p-ascii, Options.i = 0)
; Cette fois PureBasic ne peut pas se débrouiller tout seul, car le
; nom de la fonction n'est pas le même que celui utilisé par le symbole
;
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
BoiteDeMessage(Fenetre.i, Corps.p-ascii, Titre.p-ascii, Options.i) As "MessageBoxA"
CompilerElse
BoiteDeMessage(Fenetre.i, Corps.p-ascii, Titre.p-ascii, Options.i) As "_MessageBoxA@16"
CompilerEndIf
EndImport
MessageBoxA(0, "Salut", "le Monde") ; Nous ne précisons pas les options
BoiteDeMessage(0, "Salut", "le Monde 2", 0)
Il faut arreter avec ce rejet visceral de l'unicode, et plutot essayer d'évoluer un peu !
Re: fonction Import -> Erreur du Linker
Publié : mer. 13/juil./2016 9:02
par Zorro
Fred a écrit :Autant utilser les API unicode si tu compiles en unicode, je ne vois pas ou est la galere:
je l'aurai un jour..... je l'aurai !
ps: en plus dans la doc a la rubrique [mots clefs avancés] ---pseudo-type , le meme exemple est donné

Re: fonction Import -> Erreur du Linker
Publié : mer. 13/juil./2016 10:02
par Mesa
Pour info, aucunes des solutions proposées dans ce fil ne fonctionnent avec xp32 et v550b2.
M.
Re: fonction Import -> Erreur du Linker
Publié : mer. 13/juil./2016 14:51
par Fred
Quelle est l'erreur ?
Re: fonction Import -> Erreur du Linker
Publié : ven. 15/juil./2016 10:46
par JohnJohnsonSHERMAN
@Mesa : Je plussoie, sous XP x32, il n'y a certes plus d'erreur de linker mais aucune boite de message ne s'affiche...
@Fred : pas d'erreur mais pas d'effet non plus, rien ne se passe... je vais tester sous W10 x64 la version unicode et la pseudo-ascii, et je te tiens au courant.
Re: fonction Import -> Erreur du Linker
Publié : ven. 15/juil./2016 14:15
par Mesa
Même chose que sherman, pas d'erreur, rien ne se passe, rien ne s'affiche.
M.
Re: fonction Import -> Erreur du Linker
Publié : lun. 18/juil./2016 14:17
par Mesa
Ça marche si au préalable on ouvre une fenêtre ou un requester:
Code : Tout sélectionner
MessageRequester("ok","azerty")
Import "User32.lib"
; Nous utilisons le pseudotype 'p-unicode' pour les paramètres chaîne, car
; MessageBoxW() est une fonction unicode seulement. Le compilateur va
; automatiquement convertir les chaînes en unicode quand nécessaire.
;
MessageBoxW(Fenetre.i, Corps$, Titre$, Options.i = 0)
;MessageBoxW(Fenetre.l, Corps.p-unicode, Titre.p-unicode, Options.l=0) ; fonctionne
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "MessageBoxW"
CompilerElse
BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "_MessageBoxW@16"
BoiteDeMessage2(Fenetre.l, Corps.p-unicode, Titre.p-unicode, Options.l ) As "_MessageBoxW@16"
CompilerEndIf
EndImport
; Cela fonctionnera correctement en mode ascii et en mode unicode, même si l'API est uniquement
; unicode car le compilateur s'occupera lui-même de la conversion.
;
MessageBoxW(0, "Salut", "le Monde")
BoiteDeMessage(0, "Salut 2", "le Monde 2",0)
BoiteDeMessage2(0, "Salut 3", "le Monde 3",0)
Code : Tout sélectionner
If OpenWindow(0, 0, 0, 220, 100, "Exemple...", #PB_Window_SystemMenu)
ButtonGadget (1, 10, 60, 200, 30, "Fermer")
Import "User32.lib"
; Nous utilisons le pseudotype 'p-unicode' pour les paramètres chaîne, car
; MessageBoxW() est une fonction unicode seulement. Le compilateur va
; automatiquement convertir les chaînes en unicode quand nécessaire.
;
MessageBoxW(Fenetre.i, Corps$, Titre$, Options.i = 0)
;MessageBoxW(Fenetre.l, Corps.p-unicode, Titre.p-unicode, Options.l=0) ; fonctionne
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "MessageBoxW"
CompilerElse
BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "_MessageBoxW@16"
BoiteDeMessage2(Fenetre.l, Corps.p-unicode, Titre.p-unicode, Options.l ) As "_MessageBoxW@16"
CompilerEndIf
EndImport
; Cela fonctionnera correctement en mode ascii et en mode unicode, même si l'API est uniquement
; unicode car le compilateur s'occupera lui-même de la conversion.
;
MessageBoxW(0, "Salut", "le Monde")
BoiteDeMessage(0, "Salut 2", "le Monde 2",0)
BoiteDeMessage2(0, "Salut 3", "le Monde 3",0)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 1
CloseWindow(0)
End
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
C'est le même "problème" qu'avec les fonctions sonores, il faut au moins un requester pour que ça fonctionne sous XP.
M.
Re: fonction Import -> Erreur du Linker
Publié : lun. 18/juil./2016 19:47
par Fred
WinXP necessite peut etre l'appel à InitCommonControlsEx_() et CoInitialize_()