Bonjour à tous,
Je n'arrive pas à utiliser un ActiveX d'un fournisseur.
Cet ActiveX est en fait un objet .Net qui supporte COM.
J'ai deux approches possibles:
-1- utilisation direct de l'ActiveX importé dans mon application Delphi
-2- affichage d'une page HTML incorporant l'ActiveX avec un WebBrowser.
Je préfère la deuxième approche car elle est plus souple. Mais de toute façon rien ne marche pour l'instant.
Approche 1:
J'ai d'abord vérifié que je pouvais inclure l'ActiveX dans une UserForm de Word: c'est Ok.
Avec Delphi 2006, l'importation sous la forme d'un ActiveX ou d'un Assembly .Net échoue. J'arrive faire l'import à partir de la bibliothèque de types.
Ensuite, quand je pose le composant sur une form, j'ai une erreur "fichier non trouvé".
Avec Delphi 2010, je n'arrive pas importer l'ActiveX. L'import de l'assembly .Net
et de la bibliothèque de type fonctionne. Je peux ensuite poser le composant sur une TForm (tout devient très lent). Je peux compiler l'application nmais je ne peux pas l'exécuter: rien n'apparaît à l'écran, je suis obligé de tuer le process à travers le gestionnaire des taches (CPU à 0 %).
J'ai essayer d'utiliser l'objet COM directement, sans passer par un composant:
ça se bloque au niveau du CreateInstance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 procedure TForm1.InvokeCLSIDClick(Sender: TObject); var clsid: TCLSID; sCLSID: string; result: hresult; localCLSCTX: Integer; IApp: IUnknown; ClassFactory2: IClassFactory2; ProgId: PWideChar; begin // initialize COM ProgId := 'ActiveX_Test.AxControl'; //for Acrobat Reader: 'AcroPDF.PDF.1' CoInitialize(nil); localCLSCTX := CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER; try // Get CLSID from ProgId result := CLSIDFromProgID(ProgId, clsid); //I get '21CD2964-DC18-4C02-A26F-4430AFB00C1F' OleCheck(result); //for Acrobat Reader, I get 'CA8A9780-280D-11CF-A24D-444553540000' result := CoGetClassObject(clsid,localCLSCTX,nil,IID_IClassFactory, ClassFactory2); OleCheck(result); ShowMessage('Class ActiveX_Test.AxControl CoGetClassObject OK'); //here, all is Ok result := ClassFactory2.CreateInstance(nil,System.TGUID(IID_IUnknown), IApp); //Application hangs with the test ActiveX OleCheck(result); //with Acrobat Reader it is working ShowMessage('Class ActiveX_Test.AxControl CreateInstance OK'); except on e: EOleSysError do begin ShowMessage('Class MWV_ActiveX_Test.AxControl invoke error'); end; end; // deinitialize COM CoUninitialize; end;
Approche 2
Voici le fichier HTML qui incorpore l'ActiveX:
Après avoir réglé les options de sécurité d'Internet Explorer, j'arrive ouvrir la page html directement dans Internet Explorer sans qu'il y ait de messages.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 <HTML> <HEAD> </HEAD> <BODY> <OBJECT ID="Control" Name="Control" WIDTH=312 HEIGHT=445 CLASSID="CLSID:21CD2964-DC18-4C02-A26F-4430AFB00C1F"> <p>Error loading activeX. Either control not installed or it is disabled by a security setting</p> </OBJECT> <script type="text/javascript" for="Control" event="Event1Fired"> alert("Event1Fired event handled via javascript handler"); </script> <script type="text/javascript" for="Control" event="Event2Fired"> alert("Event2Fired event handled via javascript handler"); </script> </BODY> </HTML>
En utilisant le TWebBrowser de Delphi j’obtiens des résultats très étranges:
Avec mon application déja existante faite sous D2006 ça marche dans mon environnement de développement (machine virtuelle XP avec IE6), ça marche sous ma machine hôte Seven 32 bits avec IE8, par contre ça ne marche pas sur le PC destination que je voudrais utiliser (XP pro 32 bits avec IE7, puis j'ai essayé IE8). (ne marche pas = l'application freeze, CPU à 0 %)
Les frameworks 2.0, 3.5, et 4 sont installés.
Le plus étrange c'est que si je créé une nouvelle application à partir de zéro, et je fais un copier collé du WebBrowser de mon application déjà existante, le résultat ne marche pas dans ma machine virtuelle, ne marche pas sur le PC de destination mais ça marche sous mon Seven.
Je ne sais plus quoi faire. Si quelqu'un à une piste, merci d'avance.
Partager