Oracle Forms & Reports

WUO-705 - OleFunctions.invoke_ret_obj ()

S'applique à

Oracle Forms - Version 10.1.2 et ultérieures
Les informations de ce document s'appliquent à toutes les plateformes.
Pertinence vérifiée le : 03-Jan-2011
Pertinence vérifiée le : 03-Oct-2012

Symptômes

Lors de l'exécution d'un formulaire Forms avec webutil qui ouvre un pdf ou tout autre document,
l'exception suivante se produit :

WUO-705 [OleFunctions.invoke_ret_obj()] Unable to invoke Method: Navigate; Exception
com.jacob.com.ComFailException: VariantChangeType failed

Le document s'ouvre pourtant dans une nouvelle fenêtre du navigateur.

Étapes pour reproduire le problème :
-----------------------

1. Créez un formulaire simple avec un champ texte txt_ABC et un bouton.

2. Dans le déclencheur when-button-pressed, codez ce qui suit :

declare
-- Handle of the Application object(s) 
obtApplication CLIENT_OLE2.OBJ_TYPE; 
obtDoc CLIENT_OLE2.OBJ_TYPE;

-- Handle of the OLE argument list 
obtArgs CLIENT_OLE2.OBJ_TYPE; 

Begin
:txt_ABC := 'BEGIN'; pause;
obtApplication := client_ole2.create_obj('InternetExplorer.Application'); 
Client_Ole2.Set_Property(obtApplication,'Visible',1);

-- Tell the OLE object to load the file 
:txt_ABC := 'LOAD'; pause;
obtArgs := client_ole2.create_arglist; 
Client_Ole2.add_arg(obtArgs, 'd:\temp\dept.pdf'); -- Some existing PDF file name here
obtDoc := Client_Ole2.invoke_obj(obtApplication, 'Navigate', obtArgs); 
Client_Ole2.destroy_arglist(obtArgs); 

-- Release all the objects 
:txt_ABC := 'RELEASE'; pause;
Client_Ole2.release_obj(obtDoc); 
Client_Ole2.release_obj(obtApplication); 
:txt_ABC := 'END'; pause;

exception
when others then
:txt_ABC := 'EXCEPTION: Unable to view document. Error: '|| substr(sqlerrm, 100); pause;
Client_Ole2.release_obj(obtDoc); 
Client_Ole2.release_obj(obtApplication); 
End;

3. Compilez et exécutez le formulaire.

4. Cliquez sur le bouton pour ouvrir le document.

5. Vous obtenez WUO-714 [OleFunctions.setExceptionValues()] Unable to get the last OLE Error details;

Exception
null
WUO-705 [OleFunctions.invoke_ret_obj()] Unable to invoke Method: Navigate; Exception
com.jacob.com.ComFailException: VariantChangeType failed

6. Le document pdf s'ouvre dans une nouvelle fenêtre du navigateur.

Changements

Migration de 9i vers 10g avec webutil, ou mise à niveau de webutil de 1.0.5 vers 1.0.6, 10.1.2.2 ou 10.1.2.3

ou

Nouveau développement de code qui invoque une méthode.

Cause

La fonction Client_Ole2.invoke_obj ne doit être utilisée que lorsque la méthode invoquée renvoie un objet. Les types de variables utilisés et renvoyés par les méthodes et les propriétés d'une application OLE sont décrits dans son modèle objet, qui doit être respecté.

L'exception est ici en fait un avertissement, qui semblait se produire silencieusement dans la version 1.0.5.

Solution

La solution consiste à remplacer l'appel de la fonction Client_Ole2.invoke_obj par un appel de la procédure Client_Ole2.invoke .

En effet, dans ce cas, la méthode 'Navigate' du modèle objet d'Internet Explorer ne renvoie rien. Il ne faut pas utiliser invoke_obj, qui attend par conception un objet renvoyé par la méthode appelée, alors que cette méthode ne renvoie en fait rien.

Il existe différents appels invoke_xxx, adaptés au type xxx de la variable renvoyée par la méthode appelée. C'est le même principe que pour les différents appels Get_xxx_property, xxx correspondant au type de variable renvoyé par la propriété concernée. Pour en savoir plus sur ces unités de programme, consultez l'aide en ligne de Forms sur le package OLE2, car Client_OLE2 est conçu pour fonctionner de façon aussi proche que possible de celui-ci.

Dans l'exemple de code fourni dans cette note, vous pouvez effectuer les modifications suivantes :

1. Mettez en commentaire le code qui contient l'appel de la fonction Client_Ole2.invoke_obj

--obtDoc := Client_Ole2.invoke_obj(obtApplication, 'Navigate', obtArgs);

2. Remplacez-le par un appel de la procédure Client_Ole2.invoke :

Client_Ole2.invoke(obtApplication, 'Navigate', obtArgs);

3. Recompilez et testez de nouveau le formulaire : aucune erreur ne devrait se produire, puisque le code respecte maintenant le modèle objet de l'application utilisée.