Utilisation fonction DLL d'une autre application.

wapit1
Invité n'ayant pas de compte PHPfrance

13 juil. 2005, 14:59

Salut,
Je suis actuellement en stage. Mon projet et de faire évoluer un simulateur client permettant aux développeurs de la boite de tester les messages retours de la partie serveur de l'application une fois leurs modifs effectuées!
Ce simulateur existe (mais n'est pas ergonomique et ne permet de dérouler complètement l'ensemble des fonctions) en VB Excel. Afin de récupérer les données de la partie serveur, il utilise la fonction Hllapi contenue dans la DLL "PCSHLL32.DLL" de l'application communication personnelles (émulateur 3270 IBM).
Pensez vous qu'il m'est possible d'utiliser cette même fonction avec du PHP afin de faire un simulateur avec interface web. Si oui, comment?

cordialement,

wapit1
Invité n'ayant pas de compte PHPfrance

13 juil. 2005, 15:42

Engros, la fonction de la DLL remplace la connexion à la base de données.
Je sais quoi lui envoyer en paramètres et je sais comment utiliser les données qu'elle renvoie mais ce que je veux savoir c'est comment l'appeler!

Mammouth du PHP | 983 Messages

13 juil. 2005, 18:52

Je pencherais plus vers l'ASP...

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

18 juil. 2005, 09:57

je comprend ton probleme, j'ai jamais eut a faire ca, mais je vais me renseigner ...
"... demanda à voir le CV du recruteur pour être sûr que le chef du personnel était compétent".

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

18 juil. 2005, 10:01

premier élément de réponse :
1. I have built a DLL to calculate something. Is there any way to run this DLL under PHP ?

If this is a simple DLL there is no way yet to run it from PHP. If the DLL contains a COM server you may be able to access it if it implements the IDispatch interface.
traduction de cette page (jai pas lu toute les reponses), Non c'est pas possible SAUF si ta DLL implémente un serveur COM (ensuite tu passe par les fonctions COM de php)
"... demanda à voir le CV du recruteur pour être sûr que le chef du personnel était compétent".

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

18 juil. 2005, 10:09

Correction, c'est possible mais :
Avertissement
Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utilisez ce module à vos risques et périls.
Le module en question est nommé "API windows" dans la doc
Introduction
Cette extension est une API générique d'accès aux DLL. Elle a été originalement écrite pour accéder aux API Win32 depuis PHP, mais vous pouvez l'utiliser pour accéder à d'autres fonctions exportées par des DLL.

Actuellement, les types supportés sont les types PHP génériques (chaînes de caractères, booléens, nombres, entiers et NULL), et les types que vous définissez avec w32api_deftype().
voici la liste complete des fonctions dispo :
w32api_deftype -- Définit un type pour utilisation avec les fonctions windows API
w32api_init_dtype -- Crée une instance de type de données et la remplit
w32api_invoke_function -- Appelle une fonction windows 32
w32api_register_function -- Enregistre une fonction win32 dans PHP
w32api_set_call_method -- Modifie le type d'appel de la fonction
J'espére que ca répond a ta question, sinon envoie moi un MP et on cherchera plus en avant
"... demanda à voir le CV du recruteur pour être sûr que le chef du personnel était compétent".

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

19 juil. 2005, 20:50

Salut,
je sais pas si tu te rapelle de ce post mais tu m'y a proposé de t'envoyé un mp si j'avais du nouveau. Ce que je fais ici.
J'ai essayé d'utiliser l'api "php_w32api.dll" et voilà le message que j'ai eu :
"Warning: dl(): Not supported in multithreaded Web servers - use extension statements in your php.ini in c:\program files\easyphp1-8\www\simul\index.php on line 4"
J'ai bien déclaré "extension=php_w32api.dll" dans tous les php.ini que j'ai trouvé mais ça n'a rien changé!
Si t'as une idée...
"... demanda à voir le CV du recruteur pour être sûr que le chef du personnel était compétent".

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

19 juil. 2005, 21:10

petite note qui m'avais échappé :
Note : Cette extension a été déplacée dans le module PECL et ne sera plus intégrée dans PHP à partir de PHP 5.1.0.
le nouveau package est là : http://pecl.php.net/package/ffi
Autre truc glané sur le net :
La fonction dl() est déprécié depuis PHP 5. Utilisez les directives d'extensions de chargement à la place.
autrement dit l'exemple "officiel" marche difficilement en php 5, mais si mes souvenirs sont bons easyphp est en 4.X => ca devrais pas venir de là

Je vais passer par des truc tout bête, je te prie de m'en excuser, mais je me suis fait avoir plusieurs fois a chercher midi à quatorze heures ces temps ci ...
Donc :
- as tu bien décommenter la ligne "extension=php_w32api.dll" du php.ini (oui => ok :) )
- il faut aussi controler la ligne "extension_dir =" est s'assurer qu'elle pointe bien vers le dossier des extentions php qui devrais contenir un fichier appellé "php_w32api.dll"
- ensuite on sauvegarde et passage obligatoire par un redémarage d'apache
- a ce point on va controler le chargement de l'extention avec un bête fichier :
<?php
php_info();
?>
:)
ce qui devrais produire en milieu de page le résultat suivant :
Win32 API
Win32 API Support enabled
Si c'est pas le cas => :?
Sinon c'est que l'extention est utilisable, pas besoin de faire d'appel à dl()

Voyon ce que ca donne avec ca ...

Mais en attendant je vais te donner d'autre pistes dont je n'avais pas voulu parler avant car elles sont moins pratiques :
- réaliser une DLL compatible avec PHP qui s'interfacerais avec ta DLL non-PHP (ce qui reviens à la php_w32api.dll sans le coté générique)
- réaliser une appli Client / serveur dont le coté client est un script PHP et le coté serveur une appli qui peut s'interfacer avec la DLL (idem solution 1 mais encore plus lent / lourd)
"... demanda à voir le CV du recruteur pour être sûr que le chef du personnel était compétent".

Eléphanteau du PHP | 35 Messages

20 juil. 2005, 09:38

Apparemment avant de parler de php_w32api.dll, le problème est dans un premier temps sur le dl()!
Je n'ai pas bien compris ce que voulait dire :
"La fonction dl() est déprécié depuis PHP 5. Utilisez les directives d'extensions de chargement à la place. "

De toute façon easyphp 1.8 utilise PHP Version 4.3.10.
Donc doit falloir faire autre chose!

Eléphanteau du PHP | 35 Messages

20 juil. 2005, 09:45

J'ai bien vérifié que enable_dl était sur "on" et que le safe_mode était sur "off" donc ça vient pas de là! :cry:

Eléphanteau du PHP | 35 Messages

20 juil. 2005, 09:52

Si j'ai bien compris la Note du bas de page du Manuel PHP concernant la fonction dl(), pas besoin d'utiliser dl() si extension = php_w32api.dll déclaré dans php.ini.
J'ai essayé de faire

Code : Tout sélectionner

w32api_register_function("pcshll32.dll", "hllapi","string"); w32api_invoke_function($FUNC, $DATA_STRING, $DATA_LENGTH, $RETURN);
directement mais j'ai : "Fatal error: Call to undefined function: w32api_register_function() " en retour!

Eléphanteau du PHP | 35 Messages

20 juil. 2005, 10:00

J'ai remarqué que quand je clique dans easyphp/administration/extensions, j'ai bien Win32 API [ fonctions ]
qui s'est ajouté mais si je clique sur Fonctions, j'ai pas accès aux fonctions comme pour les autres extensions.

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

20 juil. 2005, 10:36

bon, je viens de lire plus en avant les différentes doc et voila ce que j'ai glané :
LA DOC OFFICIELLE C'EST DES CONNERIES !
Si tu va là : http://fr.php.net/manual/fr/ref.w32api.php et que tu dessend dans les posts ils disent que les fonctions ne sont pas dispo, mais qu'il faut utiliser un objet appelé win32
<?php
if (!extension_loaded ('Win32 API') && !dl("php_w32api.dll")) {
  echo "Unable to load php_w32api.dll";
  exit;
}

$api = new win32;
$api->registerfunction("bool QueryPerformanceCounter (float &lpPerformanceCount) From kernel32.dll");
$api->registerfunction("bool QueryPerformanceFrequency (float &lpPerformanceFrequency) From kernel32.dll");

$api->QueryPerformanceCounter($a);
$api->QueryPerformanceFrequency($b);
$c = $a/$b;
$days = floor($c / 86400);
echo gmstrftime("System uptime is $days Days, %H Hr, %M Min, %S Sec<br>", $c);
?>
Mais (parce qu'il y'a un mais) plus je lis la doc plus j'ai l'impression qu'ils limitent cette extention aux seules API officielles de windows
=> si ca marche pas, faudra penser a faire ta propre extention php
http://fr.php.net/manual/fr/zend.creating.php
"... demanda à voir le CV du recruteur pour être sûr que le chef du personnel était compétent".

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

20 juil. 2005, 10:39

bon ben, j'ai installé easyphp pour tester et l'exemple ci dessus provoque un crash d'apache ;)
"... demanda à voir le CV du recruteur pour être sûr que le chef du personnel était compétent".

Eléphanteau du PHP | 35 Messages

20 juil. 2005, 10:55

donc pô possible!
Quelqu'un aurait une idée sur une autre techno permettant de réaliser ça?