PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Utilisation d'une DLL Ghostscript  en WD25
Utilisation d'une DLL Ghostscript en WD25
Débuté par Worm, 01 oct. 2020 15:21 - 5 réponses
Posté le 01 octobre 2020 - 15:21
Bonjour,

Ayant besoin (entre autre) de transformer des .ps en .pdf j'essaye d'utiliser le fonctionnement d'appel de DLL.
Certes je pourrai aussi faire appel à un LanceAppli avec cmd pour exécuter une commande dos, mais ce n'est pas mon souhait ...

Sur un exemple basique ( https://doc.pcsoft.fr/fr-FR/?3014006 ) d’utilisation d'une DLL

(Pour faire au plus simple, je ne fais qu'un appel a la fonction gsdll_revision qui avec un "Null" renvoi toutes les infos de la version du Ghostscript )

J'adapte celui-ci ainsi :

hInst est un entier
hInst = ChargeDLL("C:\gs\gs9.53.3\bin\gsdll32.DLL")
SI hInst = 0 ALORS
Erreur(ErreurInfo())
SINON
Info("DLL chargée")
// https://www.ghostscript.com/doc/current/DLL.htm#revision
AppelDLL32("gsdll32.DLL", "gsdll_revision", Null)
AppelDLL32("gsdll32.DLL", "gsdll_init", Null)
DéchargeDLL(hInst)
FIN


Mais voila, j'ai l'erreur, ci dessous.

La fonction 'gsdll_revision' de la DLL 'gsdll32.DLL' a provoqué une erreur d'exécution.

Pile des appels :
Clic sur Bouton2 (home.Bouton2), ligne 8

La fonction 'gsdll_revision' de la DLL 'gsdll32.DLL' a provoqué une erreur d'exécution.

Pile des appels :
Clic sur Bouton2 (home.Bouton2), ligne 8

Date : 01/10/2020 14:39:20
Projet : GS_DLL

Informations supplémentaires :
Code erreur : 2805
Module : 'wd250vm.dll (01F250089f - 25.0.480.3)
Informations de débogage :

Details techniques :

Module : gsdll32.DLL
Adresse de base : 04F20000
Erreur systeme : Access violation (GPF)
EIP = 04F211DC
OS : Windows 7 Service Pack 1(6.1.7601)
Registres :

  EIP = 04F211DC    EBP = 003CD670
  EAX = 0568B170    EBX = 009E8600
  ECX = EF82EF82    EDX = 00000000
  ESI = 00000000    EDI = 003CDB90

Pile des appels :

[gsdll32.DLL (04F20000)] 04F211C0 : gsdll_revision() + 28 bytes

Fonction (0,18)
EIT_TYPE_WDFILE : <2>
EIT_IDCODE : <18>


J'avoue ne pas trop comprendre cette erreur " Access violation (GPF) " malgré différente recherche ...
A toute fin utile, la DLL est bien chargée et la fonction est bien lu par l'AppelDLL32.

Merci a tous ceux qui pourrons m'aiguiller.
Membre enregistré
945 messages
Popularité : +102 (110 votes)
Posté le 01 octobre 2020 - 16:18
Bonjour
d'après la documentation gsapi_revision attend 2 paramètres
un pointeur sur une structure t sa taille
st_gsapi_revision_s est une structure
product est un entier système
copyright est un entier système
revision est un entier système
revisiondate est un entier système
END
gsapi_revision_s est une st_gsapi_revision_s
AppelDLL32("gsdll32.DLL", "gsdll_revision", &gsapi_revision_s, Dimension(gsapi_revision_s)
:

--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
945 messages
Popularité : +102 (110 votes)
Posté le 01 octobre 2020 - 17:46
désolé j'ai pris la mauvaise doc
DllName est une chaîne = "D:\Program Files\gs\gs9.53.3\bin\gsdll64.dll"

product est un entier système = 0
copyright est un entier système = 0
revision est un entier système = 0
revisiondate est un entier système = 0

IF ChargeDLL(DllName) THEN
API(DllName, "gsdll_revision", &product, &copyright, &revision, &revisiondate)
Trace(ChaîneRécupère(product, crAdresseASCIIZ))
Trace(ChaîneRécupère(copyright, crAdresseASCIIZ))
ELSE
STOP
END


--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
945 messages
Popularité : +102 (110 votes)
Posté le 01 octobre 2020 - 20:36
Bonsoir
code un peut plus complet
// https://www.ghostscript.com/doc/current/DLL.htm#revision
DllName est une chaîne = "D:\Program Files\gs\gs9.53.3\bin\gsdll64.dll"
hndDLL est un entier système
product est un entier système = 0
copyright est un entier système = 0
revision est un entier système = 0
revisiondate est un entier système = 0
args est un tableau dynamiquedynamique de 0 chaînes
argi est un tableau dynamiquedynamique de entiers systèmeme
code est un entier = -100
command est une chaîne

hndDLL = ChargeDLL(DllName)
IF hndDLL > 0 THEN
API(DllName, "gsdll_revision", &product, &copyright, &revision, &revisiondate)
Trace(ChaîneRécupère(product, crAdresseASCIIZ))
Trace(ChaîneRécupère(copyright, crAdresseASCIIZ))
Trace(revision)
Trace(DateVersChaîne(NumériqueVersChaîne(revisiondate),"jj/mm/aaaa"))

Dimension(args, 10)
args[1] = "gswin64c.exe"
args[2] = "-q"
args[3] = "-P-"
args[4] = "-dSAFER"
args[5] = "-dNOPAUSE"
args[6] = "-dBATCH"
args[7] = "-sDEVICE#pdfwrite"
args[8] = "-dCompatibilityLevel#1.4"
args[9] = "-sOutputFile#d:\temp\alphabet.pdf"
args[10] = "d:\temp\alphabet.ps"

Dimension(argi, 10)
argi[1] = &args[1]
argi[2] = &args[2]
argi[3] = &args[3]
argi[4] = &args[4]
argi[5] = &args[5]
argi[6] = &args[6]
argi[7] = &args[7]
argi[8] = &args[8]
argi[9] = &args[9]
argi[10] = &args[10]

code = API(DllName, "gsdll_init", &gsdll_callback, Handle(FenEnCours()), 10, &argi)
IF code = 0 THEN
API(DllName, "gsdll_execute_begin")
command = "gsave" + CRLF
code = API(DllName, "gsdll_execute_cont", &command, Taille(command))
Trace(code) //0 c'est ok
API(DllName, "gsdll_execute_end")
API(DllName, "gsdll_exit")
ELSE
IF code = -100 THEN
// <= -100 "quit" has been executed, or fatal error. gsdll_exit() must then be called: do not call gsdll_execute_end().
Info("bad code"+TAB+code)
API(DllName, "gsdll_exit")
ELSE
Info("bad code"+TAB+code)
END
END
DéchargeDLL(hndDLL)
ELSE
STOP
END


--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
945 messages
Popularité : +102 (110 votes)
Posté le 06 octobre 2020 - 15:41
bonjour
petite simplification du code
arguments = "gswin64c.exe;-q;-P-;-dSAFER;-dNOPAUSE;-dBATCH;-sDEVICE#pdfwrite;-dCompatibilityLevel#1.4;-sOutputFile#d:\temp\alphabet.pdf;d:\temp\alphabet.ps"
Dimension(args, ChaîneOccurrence(arguments,";")+1)
ChaîneVersTableau(arguments, args, ";")
Dimension(argi, Dimension(args))
FOR i=1 _TO_ Dimension(args)
argi[i] = &args[i]
END


a la place de
Dimension(args, 10)
args[1] = "gswin64c.exe"
args[2] = "-q"
args[3] = "-P-"
args[4] = "-dSAFER"
args[5] = "-dNOPAUSE"
args[6] = "-dBATCH"
args[7] = "-sDEVICE#pdfwrite"
args[8] = "-dCompatibilityLevel#1.4"
args[9] = "-sOutputFile#d:\temp\alphabet.pdf"
args[10] = "d:\temp\alphabet.ps"

Dimension(argi, 10)
argi[1] = &args[1]
argi[2] = &args[2]
argi[3] = &args[3]
argi[4] = &args[4]
argi[5] = &args[5]
argi[6] = &args[6]
argi[7] = &args[7]
argi[8] = &args[8]
argi[9] = &args[9]
argi[10] = &args[10]


--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
945 messages
Popularité : +102 (110 votes)
Posté le 29 octobre 2020 - 20:57
pas de retour ?

--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer