Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php/COM] Component Object Model + API
woolkan
post
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 10.06.2006

Ostrzeżenie: (0%)
-----


Witam,

mam bardzo nietypowy problem. Potrzebuje napisać aplikacje w php która będzie wykożystywać API zainstalowane na systemie windosowym. Do API mam dostęp przez COM (Component Object Model). Wiem że w php COM jest dostępny tylko dla wersji Windosowych więc postawiłem sobie pod XP serwer IIS oraz PHPv5.1.6.

Problem jest tego typu: jak dostać się do dostarczonego API? w necie nic nie znalazłem co mogłoby mnie naprowadzić jak używać COM w php i prawdę mówiąc nie mam zielonego pojęcia jak uruchomić to API z php (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) w manualu php też niewiele pisze:(

Plik PDF z dokumentacją znajduje się pod tym adresem: plik pdf.

API dotyczy platformy inwestycyjnej o której możesz poczytać na tej stronie: http://cms-forex.com/, dodatkowo możesz załozyć konto demo które będzie potrzebne do testowania API. Sama platforma oraz API dla tej platformy jest dostępne na stronie http://vtsystems.com/en/products/.

I teraz (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) po zainstalowaniu platformy (VT Trader) na dysku a następnie API (VT Trader API) możesz mieć dostęp do swojego konta inwestycyjnego poprzez inne oprogramowania niżeli VT Trader (to chyba oczywiste). W katalogu gdzie instaluje się API są dostępne przykłady dla różnych języków programowania takich jak VB, C#, PERL, JAVA oraz pliki excelowskie z makrami pisanymi w VB dla excela. Brak przykładu dla php (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ;P
Moim zadaniem jest napisanie aplikacji która będzie umożliwiała połączenie się z serwerami platformy (dla demo serwera adres: vtdemo.fxserver.com) a następnie pobranie informacji o stanie konta (czyli otwarte pozycje stan konta etc.) oraz sprawdzenie aktualnych notowań. W sumie całość będzie podobna do przykładowego pliku excelowego z katalogu z API. Cała aplikacja ma chodzić na serwerze z systemem Windows XP (najpierw a później będzie migracja na win2k3) a dostęp musi być poprzez WWW.

Defakto całość nie wydaje się jakoś szczególnie trudna zwarzywszy że API dostarcza gotowych funkcji które mają zwracać z serwera odpowiednie dane więc moja praca będzie się ograniczać do obrobienia i wyświetlenia danych wyjściowych i tyle.
Najtrudniejszą rzeczą w chwili obecnej jest połączenie się poprzez API. Nigdy wcześniej nie miałem do czynienia z COM i dlatego to dla mnie jest nie do przejścia w chwili obecnej (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Co prawda mógłbym napisać w jakimś języku programowania lecz niestety c++ znam słabo a za jave dopiero się zabrałem więc inne języki poza php odpadają.


Z góry wielkie dzięki wszystkim za ewentualną pomoc,
woolkan (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
jarek_bolo
post
Post #2





Grupa: Zarejestrowani
Postów: 149
Pomógł: 12
Dołączył: 3.03.2008
Skąd: łódzkie

Ostrzeżenie: (0%)
-----


Cytat(CuteOne @ 25.08.2014, 12:22:14 ) *
Sprawdź REGSVR32 /u nazwa-pliku.dll

Uruchomienie tej komendy powiodło się (takie okno dialogowe wyskoczyło). Dodatkowo nastąpiło usunięcie wpisu w rejestrze, który wyżej podałem.

Teraz wywołanie tej biblioteki API zarówno z CLI jak i z przeglądarki zwraca błąd o niezarejestrowanej klasie:
Kod
exception 'com_exception' with message 'Failed to create COM object `{CE92C3B9...9170AEF7F}': Klasa niezarejestrowana. ' in C:\wamp\www\backoffice\index.php:6 Stack trace: #0 C:\wamp\www\backoffice\index.php(6): com->com('{CE92C3B9...') #1 {main}


I znowu wracam do tematu (IMG:style_emoticons/default/smile.gif)

COM, który chciałem używać działa już mi i łączę się pięknie z serwerem poprzez API udostępniane jako DLL.

Teraz mam problem z Event Handlerem :/

To API posiada interfejs dla 3 eventów, OnServerConnect, OnServerDisconnect oraz OnNewData.
Zgodnie z dokumentacją PHP do zarejestrowania obiektu odpowiadającego za gadanie z Event Handlerami COMa używam tej funkcji: com_event_sink($COM_Object, $Event_Handler_Object, 'Interfejs_Eventow_COM')

Całość wygląda tak:
  1. class ApiEventSinker {
  2. private $terminated = false;
  3. private $data = '';
  4.  
  5. public function OnServerConnect() {
  6. }
  7.  
  8. public function OnServerDisconnect() {
  9. $this->terminated = true;
  10. }
  11.  
  12. public function OnNewData($data) {
  13. if (!empty($data)) {
  14. $this->data = $data;
  15. return true;
  16. }
  17. return false;
  18. }
  19.  
  20. public function IsConnectionLost() {
  21. return $this->terminated;
  22. }
  23.  
  24. public function GetData() {
  25. return $this->data;
  26. }
  27. }
  28.  
  29. try {
  30. $api = new COM("API.Class", null, CP_UTF8);
  31. $login_status = $api->Login('adres', port, 'login', 'haslo');
  32. echo $login_status;
  33.  
  34. $subscriptions[] = null;
  35. $response = '';
  36. $subscriptions[] = $api->Subscribe('<CRITERIA><ORDERS/></CRITERIA>', $response);
  37. echo "\n\n".'Odpowiedź z subskrypcji: '.$response."\n\n}";
  38. print_r($subscriptions);
  39.  
  40. $apiEvents = new ApiEventSinker();
  41.  
  42. if (!com_event_sink($api, $apiEvents, 'API.Class.events')) {
  43. die ('Nie udało się stowrzyć handlera do Eventów');
  44. }
  45.  
  46. $data = '';
  47. do {
  48. if ($apiEvents->OnNewData($data)) {
  49. echo $apiEvents->GetData();
  50. }
  51. if ($apiEvents->IsConnectionLost()) {
  52. echo 'Polaczenie zerwane';
  53. break;
  54. }
  55. } while (true);
  56.  
  57. $api->Logout();
  58.  
  59. } catch (com_exception $e) {
  60. echo $e;
  61. }


Odpalam powyższy skrypt w konsoli. COM działa, dokonuje się subskrypcja, ale dodawanie wszelkich nowych zleceń do systemu nie powoduje przepływu eventa o tym zdarzeniu (nowe zleceni) do skryptu, nic się nie dzieje, skrypt cały czas siedzi w pętli while().

Jeśli tego nie przeskoczę będę musiał odpalić VisualStudio i niestety sięgnąć po C# czego wolałbym uniknąć.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 16:39