OVH Cloud OVH Cloud

[WD 7.5] Problème PrinterDialogBox DLL

10 réponses
Avatar
titou17
Bonjour à tous j'ai un problème avec un appel de dll sensé ouvrir la
boite de dialogue des imprimantes de Windows. Bon sans plus tarder
voila le code :

PRINTDLG est une structure
lStructSize est un entier
hwndOwner est un entier
hDevMode est un entier
hDevNames est un entier
hDC est un entier
flags est un entier
nFromPage est un entier
nToPage est un entier
nMinPage est un entier
nMaxPage est un entier
nCopies est un entier
hInstance est un entier
lCustData est un entier
lpfnPrintHook est un entier
lpfnSetupHook est un entier
lpPrintTemplateName est une chaîne
lpSetupTemplateName est une chaîne
hPrintTemplate est un entier
hSetupTemplate est un entier
FIN

pd est un PRINTDLG
pd:lStructSize = Dimension(pd)
pd:hwndOwner = Handle("Text Control")
AppelDLL32("comdlg32.dll", "PrintDlgA" , &pd)


Or je n'obtient aucun résultat. Le handle récupère le numéro d'une
fenetre fille mais j'ai essayé aussi avec la fenetre mère et pas
d'ouverture de boite de dialogue !!! J'ai tenté avec un handle null
mais rien non plus.
La méthode appelDLL32 renvoie 0.
Bon je vois pas trop ou se situe le problème. Si qq'un a ne serait-ce
qu'une petite idée qu'il me fasse signe parce que sans ça, ça va être
un peu compliqué d'imprimer.
Merci par avance pour vos réponses

Antoine V.

10 réponses

Avatar
Gégé
Le code de la structure que tu fournis est erronée
Recopie celui sur http://centrewd.free.fr/?page=ficheapi&t=s&n=PRINTDLG
Et modifie les types d'entier avec ce qui est indiqué dans le fichier
d'aide avec en recherche les mots-clés "types d'entier"
Avatar
Fabrice Burghgraeve
bonjour.

"Antoine" a écrit dans le message de
news:
Bonjour à tous j'ai un problème avec un appel de dll sensé ouvrir la
boite de dialogue des imprimantes de Windows. Bon sans plus tarder
voila le code :

PRINTDLG est une structure


(...)
lpPrintTemplateName est une chaîne
lpSetupTemplateName est une chaîne


(...)
Bon je vois pas trop ou se situe le problème


(...)

ben il est la a priori.
Il ne faut jamais utiliser le type chaine pour les appels aux DLLs, mais le
type chaine asciiz.

et encore.... Pas dans ce cas la...
dans la definition de la structure, on a :

LPCTSTR lpPrintTemplateName;
LPCTSTR lpSetupTemplateName;

ce sont des pointeurs vers une chaine null-terminee.
En windev, ca ne se traduit ni par des chaines, ni par des chaines ascizz,
mais par un entier. (et oui on l'aime le typage vachement clair de
windev...)
Comme dans ton cas, tu ne veux visiblement pas utiliser une boite de
dialogue personnalisée, ces valeurs sseront a 0.

Je ne saurais que trop te conseiller de consulter la doc sur cet API sur
www.msdn.com avant de te lancer la dedans...

Bon courage...
Les appels aux APIs windows sont merdiques au possible en windev, mais je te
rassure, apres t'etre arraché la moitié des cheveux, ca finit par
fonctionner...


--
Fabrice Burghgraeve
Computer & Services
suivez ce lien pour me repondre en prive :
http://cerbermail.com/?I3GMPRuXDD
Avatar
Marvel
>> Bonjour à tous j'ai un problème avec un appel de dll sensé ouvrir la




boite de dialogue des imprimantes de Windows

Salut Antoine,

J'ai peut -être raté un épisode, mais est-ce qu'un simple 'iconfigure' ne te
suffirait pas ?

Marvel
--
Ce message a été posté via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/
Avatar
Marvel
>> Bon courage...




Les appels aux APIs windows sont merdiques au possible en windev, mais je te
rassure, apres t'etre arraché la moitié des cheveux, ca finit par
fonctionner...

Salut Fabrice,

Je crois que tu exagères un peu !
Depuis qu'il y a WD7API, l'appel des API est quand bien facile !!!
Ce qui est surtout compliqué avec une API, c'est .... l'API elle même, tu ne
crois pas ??

Marvel
--
Ce message a été posté via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/
Avatar
Gégé
> Ce qui est surtout compliqué avec une API, c'est .... l'API elle même, tu ne
crois pas ??



Non, il y a des restrictions avec certaines API si tu dois leur passer
des chaines ASCIIZ. Celles de Windev sont limitées à 64K jusqu'en 7.x.
A ce propos, WD8 change t-il qq chose ?
Avatar
titou17
Je tiens tout d'abord à vous remercier de vos réponses si rapide.Après
toute une matinée passée sur msdn et sur vos différents sites je n'ai
toujours pas réussi à ouvrir cette boite de dialogue print par défaut.
J'ai modifié comme vous me l'avez dit la déclaration des variables
(pour les entier sur WD7 ils sont par défaut Long donc pas besoin de
les déclarer entier long). Ensuite sur le site de microsoft il nous
propose un exemple :

// Initialize PRINTDLG
ZeroMemory(&pd, sizeof(pd));
pd.lStructSize = sizeof(pd);
pd.hwndOwner = hwnd;
pd.hDevMode = NULL; // Don't forget to free or store hDevMode
pd.hDevNames = NULL; // Don't forget to free or store hDevNames
pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;
pd.nCopies = 1;
pd.nFromPage = 0xFFFF;
pd.nToPage = 0xFFFF;
pd.nMinPage = 1;
pd.nMaxPage = 0xFFFF;


je l'ai transcrit de cette manière :

PRINTDLG est une structure
lStructSize est un entier
hwndOwner est un entier
hDevMode est un entier
hDevNames est un entier
hDC est un entier
flags est un entier
nFromPage est un entier
nToPage est un entier
nMinPage est un entier
nMaxPage est un entier
nCopies est un entier
hInstance est un entier
lCustData est un entier
lpfnPrintHook est un entier
lpfnSetupHook est un entier
lpPrintTemplateName est une entier
lpSetupTemplateName est une entier
hPrintTemplate est un entier
hSetupTemplate est un entier
FIN

pd est un PRINTDLG
pd:lStructSize = Dimension(pd)
pd:hwndOwner = Handle(Logicaix)
pd:hDevMode = 0 // Don't forget to free or store hDevMode
pd:hDevNames = 0 // Don't forget to free or store hDevNames
pd:flags = 262144
pd:nCopies = 1
pd:nFromPage = Val("FFFF","x")
pd:nToPage = Val("FFFF","x")
pd:nMinPage = 1
pd:nMaxPage = Val("FFFF","x")
pd:lpPrintTemplateName=0
pd:lpSetupTemplateName=0
pd:hPrintTemplate=0
pd:hSetupTemplate=0

AppelDLL32("comdlg32.dll", "PrintDlgA" , &pd)

Et la boite de dialogue de n'affiche toujours pas.
Est-ce que ça pourrait venir du handle? Lequel faut-il mettre celui de
ma fenetre mère ou celui de la fille?


Je sais que ça vous réclame du temps mais c'est vraiment très
important.
Merci

Antoine Verger
Avatar
Peter
Antoine wrote:
Je tiens tout d'abord à vous remercier de vos réponses si rapide.Après
toute une matinée passée sur msdn et sur vos différents sites je n'ai
toujours pas réussi à ouvrir cette boite de dialogue print par défaut.



[cut]

Bonjour,

C'est comme GeGe a ecrit, le decaration de la structure n'est pas bon.

> nFromPage est un entier
> nToPage est un entier
> nMinPage est un entier
> nMaxPage est un entier
> nCopies est un entier

Ce sont des entiers en WD55, alors 'int on 2 bytes' (bah) avec WD7.+

Regards,

--

Peter
Avatar
titou17
J'essaye toujours de trouver le problème avec printdlg mais toujours
rien ...
J'ai même essayer avec la boite de dialogue printDlGex c'est celle qui
est un peu plus complete mais ça ne marche pas non plus et par contre
ça me renvoie un numéro d'erreur que j'arrive pas à trouver dans la
liste des constantes API fournie avec l'aide de windev.
Pour la personne qui me disait que les API sont à s'arracher les
cheveux c'est vrai mais là j'arrive à court de cheveux !!!

Antoine Verger
Avatar
titou17
Bon je retire tout ce que j'ai dit en une journée ça peut se régler
!!!
Ma boite de dialogue s'affiche après la modification du type de
données sous WD 5.5 -> WD 7.5 :
- entier -> entier sur 2 octets
- entier long -> entier (tout court !!!)

En tout cas je vous remercie vraiment tous pour vos contributions.
JE SUIS SAUVE enfin presque maintenant faut que je recupère
correctement les données mais bon le plus dur est fait

Bonne soirée

Antoine Verger
Avatar
Fabrice Burghgraeve
salut.

"Gégé" a écrit dans le message de
news:buo0oh$eob$

> Ce qui est surtout compliqué avec une API, c'est .... l'API elle même,


tu ne
> crois pas ??

Non, il y a des restrictions avec certaines API si tu dois leur passer
des chaines ASCIIZ. Celles de Windev sont limitées à 64K jusqu'en 7.x.
A ce propos, WD8 change t-il qq chose ?




Je crois qu'il y a aussi des restrictions sur les structures de structures,
ou c'est quasi-impossible, (a moins d'ecrire une DLL pour acceder a
l'API...)
et aussi sur les unions qui existent en C mais pas du tout en windev ...

Et pour avoir passé > 1 semaine avec l'aide du NG pour faire mon premier
appel aux API,
et en prenant comme point de depart un exemple fourni dans une LST,
je dirais a Marvel que non je n'exagere pas, et que non je ne trouve pas que
ce soit les APIs en elles-memes qui sont compliquees.
(elle le sont quand meme un peu, mais c'est tres tres bien documente sur le
site de microsoft, et pour quelqu'un qui a l'habitude du C c'est tres
comprehensible...)


--
Fabrice Burghgraeve
Computer & Services
suivez ce lien pour me repondre en prive :
http://cerbermail.com/?I3GMPRuXDD