Soucis d'utilisation d'une DLL sous php avec objet COM

Répondre
Bqda
le 10/06/2009 à 16:53
Bqda
Bonjour !

J'ai un "petit" soucis pour utiliser une dll en PHP. J'ai essayé plusieurs solutions mais rien de bien efficace.
La dernière en date est celle avec les objets COM.
Voici le code que j'ai pour l'instant :

<?php
$str_to_crypt = "toto";
$str_crypt = '';

$NewCom = new COM("DynamicWrapper");
$NewCom->Register("dllapi.dll", "APICcrypterMem2", "i=spss", "f=s", "r=l");
$NewCom->APICcrypterMem2($str_to_crypt, $str_crypt, 'Master', 'C:\\Cles');
?>


J'ai bien entendu intégré à mon environnement la dll concernant le DynamicWrapper.
Mon soucis est qu'à l'exécution du script, j'obtiens l'erreur suivante :

Fatal error: Uncaught exception 'com_exception' with message 'Error [0x80070057] Paramètre incorrect. ' in C:\Documents and Settings\Administrateur\Bureau\PHP\s_crypt.php:10 Stack trace: #0 C:\Documents and Settings\Administrateur\Bureau\PHP\s_crypt.php(10): com->APICcrypterMem2($str_to_crypt, '', 'Master', 'C:\Cles') #1 {main} thrown in C:\Documents and Settings\Administrateur\Bureau\PHP\s_crypt.php on line 10


Je pense que le soucis viens de la variable de type pointeur. Sinon pourquoi utiliser une dll ? Tout simplement car cette dll nous est fourni par un organisme indépendant et l'on a obligation de s'en servir pour notre application full web.
Étant donné qu'il s'agit d'un intranet, une install sur les postes clients ne pose évidemment aucun soucis.

Voici les 2 sources sur lesquelles je me suis basé pour mon code :
http://freenet-homepage.de/gborn/WSHBazaar/WSHDynaCall.htm
http://www.php.net/manual/fr/ref.w32api.php

Bien évidemment si une autre solution existe je suis preneur.

Help ! :(
LA GLOBULE
le 10/06/2009 à 21:13
LA GLOBULE
As tu essayé d'utiliser la fonction dl ? Elle est faite pour charger ce genre de librairie.

Sinon, pourrait tu nous fournir cette dll à des fins de tests pour t'aider ? Ou bien est ce confidentiel ?
Bqda
le 11/06/2009 à 12:11
Bqda
Oui je l'ai testé et ça me sort l'erreur suivante :

Warning: dl() [function.dl]: Not supported in multithreaded Web servers - use extension=dllapi.dll in your php.ini


Bien entendu j'ai déclaré mon extension dans mon .ini

Pour ce qui est de la dll, je ne préfère pas trop qu'elle se répande puisqu'une fois les tests validés elle nous permettra de crypter des données sensibles, même si entre temps les clés de cryptages changeront.
LA GLOBULE
le 11/06/2009 à 12:16
LA GLOBULE
Comment as tu déclaré ton extension dans ton php.ini ?
As tu vérifié le chemin de la directive extension_dir ?

Apparait elle quand tu fais un phpinfo ?
Bqda
le 11/06/2009 à 12:44
Bqda
Je l'ai déclaré comme suit :
extension=dllapi.dll

Pour mon extension_dir : extension_dir = "${path}\php5\ext"

Mon path est correct, je l'ai vérifié et ma dll est bien dans le répertoire.

Si je fais 1 phpinfo, mon extension n'apparait pas. Je ne comprend pas bien pourquoi d'ailleurs. Peut être est-ce parce qu'il ne s'agit pas d'une vraie extension php ?
Voilà pourquoi je suis vite passé aux objets COM.
LA GLOBULE
le 11/06/2009 à 13:56
LA GLOBULE
En théorie, tu devrais la voir dans le phpinfo.

Es tu sur de modifier le bon php.ini ? (tu peux voir le chemin du php.ini utilisé dans un phpinfo)
Si oui, as tu regardé tes logs apache / php pour voir d'ou venait le problème ?

PS : restart tu bien apache à chaque modification ? :)
Bqda
le 11/06/2009 à 14:31
Bqda
J'utilise le bon php.ini (je passe par le menu de configuration sous easyphp) et je restart bien mon serveur à chaque fois.

Le soucis est qu'il ne s'agit pas d'une librairie php comme je te l'ai dit, d'ailleurs le fichier de log vient de me confirmer qu'il n'était pas possible de charger autre chose qu'une librairie php via cette méthode. Réveillé comme je suis je n'ai même pas pensé à le consulter lol.

Voici la ligne que j'obtiens dans le fichier de log : "PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'dllapi.dll' in Unknown on line 0"
LA GLOBULE
le 11/06/2009 à 15:28
LA GLOBULE
Voici ce que j'ai lu dans la doc PHP :

J'ai compilé une DLL pour calculer quelque chose. Y a-t-il un moyen d'utiliser cette DLL sous PHP ?

Si c'est une DLL simple, il n'y a aucun moyen pour le moment de l'utiliser avec PHP. Si la DLL contient un serveur COM, vous pourrez l'utiliser si elle implémente l'interface IDispatch.


Donc a priori, si ta dll n'utilise pas cette interface, ca à l'air mal parti ton affaire :/

Sinon, dans les commentaires du manuel PHP, une personne dit avoir réussi à utiliser sa dll avec cet outil.
Bqda
le 12/06/2009 à 14:29
Bqda
Merci à toi en tout cas ! Ca doit bien être possible d'utiliser 1 dll perso en php. Je test actuellement WinBinder et ça à l'air de plus ou moins bien tourner.

Le soucis maintenant est ma variable de type pointeur qui me pose bien des misères, j'ai le droit à un magnifique plantage d'Apache.
Je vais me renseigner sur leur forum.

Merci en tout cas.
LA GLOBULE
le 12/06/2009 à 15:46
LA GLOBULE
Oui c'est possible, mais il faut coder la dll pour qu'elle fonctionne avec PHP :/
Et php a l'air plutôt chiant de ce côté la.

Espérons que winbinder puisse t'aider.
Répondre
LoadingChargement en cours