Modernisation Oracle Forms

WEBUTIL_HOST.HOST (ou CLIENT_HOST) cesse de fonctionner avec JRE 8+, JRE 7U21+ ou JRE 6U45+, sans erreur ou avec WUC-15

S'APPLIQUE À : Oracle Forms

Oracle Forms - Version 10.1.2.3.0 et ultérieures
Les informations de ce document s'appliquent à toutes les plateformes.

SYMPTÔMES : échec de WEBUTIL_HOST.HOST et/ou CLIENT_HOST avec le JRE

Après la mise à niveau du JRE (Java Runtime Environment) client vers la version 1.7.0_21+ (JRE 7u21+), 1.6.0_45+ (JRE 6u45+) ou JRE 8+, certaines commandes lancées par WEBUTIL_HOST.HOST et/ou CLIENT_HOST échouent. Aucune erreur n'est signalée dans Forms ni dans la console Java.

CHANGEMENTS : mise à niveau du JRE client

Les postes clients des utilisateurs ont été mis à niveau vers JRE 8+, JRE 7U21+ ou 6U45+

CAUSE : modification apportée au Java Plugin

L'échec résulte d'une modification apportée au Java Plugin. Avec ce changement, chaque espace d'une chaîne est interprété comme un séparateur d'arguments. Lorsque la commande ou l'exécutable contient des espaces (par exemple dans le chemin), Java interprète mal la requête. Vous trouverez plus de détails dans les notes de version de Java 7U21 et 7U25, disponibles ICI.

Voici un exemple de code Forms susceptible d'échouer :

webutil_host.host('C:\Program Files\Internet Explorer\iexplore.exe');

Remarquez les espaces dans le chemin vers iexplorer.exe

Si vous activez la journalisation de WebUtil, la ou les erreurs suivantes apparaissent dans la console Java.

2013-Apr-19  15:56:38.404 WUH[setProperty()] Setting property WUH_EXECUTION_MODE to 0
2013-Apr-19  15:56:38.404 WUH[setProperty()] Setting property WUH_EXECUTE to c:\Program Files\Internet Explorer\iexplore.exe
2013-Apr-19  15:56:38.404 WUH[setProperty()] Setting property WUH_EXECUTE to 
2013-Apr-19  15:56:38.405 WUH[Host.executeHost()] c:\Program Files\Internet Explorer\iexplore.exe
2013-Apr-19  15:56:38.406 WUH[HostCommand.execute()] c:\Program Files\Internet Explorer\iexplore.exe
2013-Apr-19  15:56:38.411 WUH[HostCommand.execute()] IOException: Cannot run program "c:\Program": CreateProcess error=2, The system cannot find the file specified
mproId1

Un autre cas signalé survient avec un code comme celui-ci :

WEBUTIL_HOST.NONBLOCKING('cmd /c "C:\Program Files (x86)\Microsoft Office\Office14\winword.exe" "C:\temp\Test document.doc"');

Dans ce cas, l'appel échoue avec l'exception suivante dans la console Java.

java.lang.IllegalArgumentException: Executable name has embedded quote, split the arguments
at java.lang.ProcessImpl.isQuoted(Unknown Source)
at java.lang.ProcessImpl.getExecutablePath(Unknown Source)
at java.lang.ProcessImpl.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at oracle.forms.webutil.host.HostCommand.execute(Unknown Source)
at oracle.forms.webutil.host.HostCommand.run(Unknown Source)
<dateStamp> ERROR>WUC-15 [HostCommand.execute()] Onverwachte fout; uitzondering: java.lang.IllegalArgumentException: Executable name has embedded quote, split the arguments

SOLUTION : Patch:16686443

Le bug est corrigé dans le correctif ponctuel générique Patch:16686443, qui peut être appliqué sur 11.1.2.1 ou 11.1.1.7

IMPORTANT : assurez-vous de télécharger le correctif qui correspond à la version d'Oracle Forms utilisée, par exemple 11.1.2.1 ou 11.1.1.7



Si le Patch:16686443 n'est pas disponible pour votre version, vous pouvez adopter la solution de contournement suivante :

IMPORTANT

Le correctif ci-dessus exige quelques modifications de votre code Forms et des paramètres de l'applet. Par exemple, il faudra :

1. que le paramètre d'applet Forms WebUtilNextGenHost soit défini à TRUE

2. que le code passé à WEBUTIL_HOST (ou CLIENT_HOST) soit encadré de guillemets doubles (ex. ") et, si la chaîne elle-même contient des guillemets doubles, que ceux-ci soient échappés par une barre oblique inverse (ex. \). Par exemple,

cmd /c "dir C:\ > \"C:\tmp\my directory\dir.txt\""

Consultez la NOTE:1568659.1 ou le README du correctif pour plus de détails.

SOLUTION DE CONTOURNEMENT

Modifiez le code pour qu'il utilise les noms courts (notation DOS 8.3).

webutil_host.host('C:\PROGRA~1\INTERN~1\iexplore.exe');

Par ailleurs, si l'application doit ouvrir des fichiers de contenu (par exemple .doc, .pdf, .txt, .mp3, etc.), vous pouvez utiliser le code suivant. Il suffit de passer le chemin et le nom du fichier. N'indiquez pas l'exécutable associé qui ouvre normalement ce contenu : le système d'exploitation s'en chargera.

Declare
    my_cmd varchar2(255);
Begin
    my_cmd := 'rundll32 shell32,ShellExec_RunDLL '|| :t1; -- :t1 could be a text field where users enter the path and name of the file they want to open
    CLIENT_HOST(my_cmd);
End;

* Consultez aussi la note 1568659.1