![]() |
![]() |
![]()
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 ![]() 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 ![]() ![]() 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 ![]() 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 ![]() |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 335 Pomógł: 6 Dołączył: 7.03.2002 Ostrzeżenie: (0%) ![]() ![]() |
Zacznij od tego:
Nie instalowalem tego API ale w ten sposob powinienes uruchomic tego COMa. Potestuj wywolania roznych funkcji i objektow jakie zwracaja. Jakby co pisz na forum ![]() P.S. Sprawdz jeszcze jakis gotowy przyklad czy biblioteka dziala jak nalezy. Ten post edytował Seth 5.10.2006, 23:44:54 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 10.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Zacznij od tego:
Nie instalowalem tego API ale w ten sposob powinienes uruchomic tego COMa. Potestuj wywolania roznych funkcji i objektow jakie zwracaja. Jakby co pisz na forum ![]() P.S. Sprawdz jeszcze jakis gotowy przyklad czy biblioteka dziala jak nalezy. Z gotowych przykładów sprawdzałem plik excelowski i tam wszystko chodzi jak burza ![]() a co do php to chyba jest gdzieś problem tylko jeszcze nie wiem gdzie. Jeśli uruchomiłem kod: to ładnie się wyświetla (IE - na stronie widać, FireFox - w źródło trzeba zaglądnąć by zobaczyć) spis serwerów tak jak to jest zamieszczone w manualu do API. Natomiast jeśli próbuję się zalogować na serwerze poprzez API to jużjest problem. Strona się ładuje i ładuje i załadować nie może... ![]() kod który użyłem do logowania:
W odpowiedzi powinienem dostać wartość INTIGER która określa komunikat z informacją zwrotną z serwera. Login i hasło które tutaj podałem to jest login i hasło do konta demo więc możesz śmiało z nich skorzystać ![]() ![]() Nie wiem gdzie leży problem. Czy to wina API (chodź na przykładach dostarczonych z API wszystko działa OKI), czy to wina IIS czy teżjest jeszcze coś o czym nie wiem a powinno być uwzględnione ![]() Czy mógłbyś zainstalować sobie to API i sprawdzić jak działa to u Ciebie? API zajmuje na HDD 2MB więc nie tak dużo ![]() Dziękuję za pomoc i pozdrawiam, woolkan Ten post edytował woolkan 6.10.2006, 10:23:45 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 335 Pomógł: 6 Dołączył: 7.03.2002 Ostrzeżenie: (0%) ![]() ![]() |
OK. Postaram sie pobawic tym troche.
Chociaz odrazu uprzedzam, ze najwczesniej bede mogl do tego zajrzec w poniedzialek :/ Inna sprawa to taka, ze moze sprawdz (zanim ja to zrobie) jak sie zachowuje ten skrypt na Windowsowym Apacheu - bo i on sie do tego nadaje. Nie wiem czy przypadkiem IIS nie blokuje COMa do wyjscia na zewnatrz. Z tego co opisales wyglada jakby nie mogl nawiazac polaczenia, a sam COM zaladowal sie bez problemu. Ten post edytował Seth 7.10.2006, 02:09:25 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 10.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
OK. Postaram sie pobawic tym troche. Chociaz odrazu uprzedzam, ze najwczesniej bede mogl do tego zajrzec w poniedzialek :/ Inna sprawa to taka, ze moze sprawdz (zanim ja to zrobie) jak sie zachowuje ten skrypt na Windowsowym Apacheu - bo i on sie do tego nadaje. Nie wiem czy przypadkiem IIS nie blokuje COMa do wyjscia na zewnatrz. Z tego co opisales wyglada jakby nie mogl nawiazac polaczenia, a sam COM zaladowal sie bez problemu. Sprawdziłem na Apache'u (koniecznie z załadowanym mod_ssl) ![]() ![]() Jeśli php łączy się poprzez COM z API to otwierany jest swego rodzaju stały proces który działa dotąd aż go nie zamknie się. Czyli jeśli odpalam pierwszy raz skrypt wywołujący plecenie:
to wszystko jest ok. Ale jeśli wywołam ponownie mój skrypt to następuje kolejne wywołanie COM przez co Apache świruje i nie przetwarza skryptu. Jedyny ratunek to restart Apacha. Najlepszym rozwiązaniem jest sprawdzenie czy COM już został wywołany. I właśnie.. co polecicie? myślałem o funkcji com_get_active_object() ![]() Seth (lub ktokolwiek inny ![]() ![]() Pozdrawiam i dziękuję, woolkan Ten post edytował woolkan 8.10.2006, 01:59:18 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 335 Pomógł: 6 Dołączył: 7.03.2002 Ostrzeżenie: (0%) ![]() ![]() |
Co do SSLa to zauwazylem, ze jest funckja setForceDisableSSL(bool), ktora wywolana przed logowaniem powinna wylaczyc korzystanie z SSLa (ustawiona na true).
Natomiast co do niszczenia obiektu to uzyj funkcji Logout(), a potem finalize(); I powinno byc po sprawie ![]() A funkcja com_get_active_object() moze w tym przypadku nie zadzialac. Raz tylko mialem z nia stycznosc i tez byly podobne problemy. Ale o co dokladnie chodzilo to juz nie pamietam :/ Poza tym wywolanie tego spowoduje pobranie juz uruchomionej instancji, a w przypadku wywolania strony przez kilka osob jednoczesnie moga byc problemy. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 10.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
setForceDisableSSL(bool) miałem ustawione na off gdy próbowałem odpalić skrypt na IIS ale to nie pomagało i nadal się nie łączył z serwerem.
Logout i finalize też już uzywam i z nimi czy bez nich po odświeżeniu okna przegladarki z załadowanym plikiem skryptu strona ładuje się w nieskończoność i jedynym ratunkiem wtedy jest restart apacha ![]() Prawdę mówiąc nie wiem co jest grane ![]() Jakbyś miał jeszcze jakieś pomysły bądź obserwacje ![]() ![]() Dziękuję i pozdrawiam, woolkan |
|
|
![]()
Post
#8
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 335 Pomógł: 6 Dołączył: 7.03.2002 Ostrzeżenie: (0%) ![]() ![]() |
Jutro sprawdze instalujac u siebie COMa ale jeszcze sprawdz czy po finalize jak dasz unset($vtApi); to czy to zadziala.
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 10.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
niestety unset($vtApi) nie pomogło. Próbowałem też tak jak jest w przykładach w manualu php dać na końcu $vtApi = null; i też lipton
![]() Sprawdzałem na drugim kompie na apachu2.2.3 bez ssl i lipton. nie pomaga ustawienie $vtApi->setDisableSSL("on") - wogóle się nie loguje na serwer. Dodatkowo problem z ponownym uruchomieniem skryptu jest taki sam.. czyli strona ładuje się w nieskończoność i jedyny ratunek to restart apacha Dziękuję i pozdrawiam, woolkan -------- EDIT-------- i jak Seth? udało Ci się odpalić? THX i pozdrawiam, woolkan Ten post edytował woolkan 10.10.2006, 18:14:41 |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 149 Pomógł: 12 Dołączył: 3.03.2008 Skąd: łódzkie Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Minęło 8 lat, może coś w technologii WAMP<->COM się posunęło do przodu. Mam dokładnie podobny problem. Również muszę połączyć się z pewnym system transakcyjnym, którego API jest bardzo podobne to powyższego. Posiadam bibliotekę API w formie pliku *.dll i kurcze nie mogę zmusić PHP/Apacha do pracy z nią za pośrednictwem COMa. Dodam, że z poziomu CLI skrypt działa. Wywołuję funkcję Login() i otrzymuję spodziewany zwrot informacji w postaci ciągu XML. Biblioteka na pewno działa, bo również są przykłady dla innych języków i działają. Bibliotekę zarejestrowałem w systemie komendą REGSVR32. Wnioskuję z tego, że mam coś źle skonfigurowane w Apachu, ale co? Po uruchomieniu skryptu przez przeglądarkę trwa jego dłuuuga praca, a następnie pojawia się strona z błędem serwera 500. Dodam, że próbowałem uruchamiać skrypt pod PHP działającym jako moduł Apacha, a teraz jako FastCGI i niestety efekty te same. Ktoś coś poradzi? -------------------- "Jeden człowiek nie zmieni świata, ale jeden człowiek może przekazać informację która zmieni świat." - David Icke
| PAMIĘTAJ, JESTEŚ POLAKIEM !!! | Jam jest Polska, Ojczyzna Twoja, ziemia Ojców, z której wzrosłeś. Wszystko, czym jesteś, po Bogu - mnie zawdzięczasz!! |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
Testowałeś dostęp COM na czymś innym niż Twoje API?
Jeżeli powyższy skrypt zadziała, to napisz (dokładnie) jaką komendą zarejestrowałeś bibliotekę |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 149 Pomógł: 12 Dołączył: 3.03.2008 Skąd: łódzkie Ostrzeżenie: (0%) ![]() ![]() |
Testowałeś dostęp COM na czymś innym niż Twoje API?
Jeżeli powyższy skrypt zadziała, to napisz (dokładnie) jaką komendą zarejestrowałeś bibliotekę EDIT: Aa widzisz ![]() ![]() Po ujednoliceniu nazw zmiennych efekt działania jest taki: W CLI: otworzyło się okno konsoli, a następnie Notatnik się uruchomił. W przeglądarece: wyświetlony został tekst NULL. Bibliotekę *.dll z API rejestrowałem poprzez uruchomienie CMD na prawach Administratora i wpisanie REGSVR32 nazwa-pliku.dll Po wciśnięciu Enter wyskoczyło okno dialogowe informujące, że z sukcesem udało się przeprowadzić operację. Sprawdzałem następnie w Rejestrze Windowsa i na pozycji HKEY_LOCAL_MACHINE\SOFTWARE\Classes\jest-nazwa-klasy-którą-zarejestrowałem Ten post edytował jarek_bolo 25.08.2014, 11:13:14 -------------------- "Jeden człowiek nie zmieni świata, ale jeden człowiek może przekazać informację która zmieni świat." - David Icke
| PAMIĘTAJ, JESTEŚ POLAKIEM !!! | Jam jest Polska, Ojczyzna Twoja, ziemia Ojców, z której wzrosłeś. Wszystko, czym jesteś, po Bogu - mnie zawdzięczasz!! |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
Sprawdź REGSVR32 /u nazwa-pliku.dll
|
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 149 Pomógł: 12 Dołączył: 3.03.2008 Skąd: łódzkie Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() 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:
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ąć. -------------------- "Jeden człowiek nie zmieni świata, ale jeden człowiek może przekazać informację która zmieni świat." - David Icke
| PAMIĘTAJ, JESTEŚ POLAKIEM !!! | Jam jest Polska, Ojczyzna Twoja, ziemia Ojców, z której wzrosłeś. Wszystko, czym jesteś, po Bogu - mnie zawdzięczasz!! |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
Spróbuj przenieść to "do {" do linii 33 lub 36
|
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 149 Pomógł: 12 Dołączył: 3.03.2008 Skąd: łódzkie Ostrzeżenie: (0%) ![]() ![]() |
Spróbuj przenieść to "do {" do linii 33 lub 36 Dzięki za zainteresowanie. Nie można subskrypcji odpalać w pętli. Każde wywołanie metody Subscribe powoduje założenie nowej subskrypcji na serwerze o danym ID zwracanym przez metodę Subscribe. Tu błąd moim zdaniem nie leży. Jest dołączony przykład w C# do tego API. Odpaliłem Visual Studio i wrzuciłem ten przykład jak również podpiąłem DLLkę z API do Projektu i po skompilowaniu wszystko działa. Ale ujawniły się dodatkowe składowe całego API o których w dokumentacji nic nie pisze :/ Główna klasa API posiada składowe typy "virtual event" do których w przykładzie załączonym przypisywane są instancje EventHandlerów o typie "delegate", które jako argument przyjmują nazwę metody zaimplementowanej w klasie korzystającej z API, która to metoda ma właśnie event odebrać. W bibliotece API jest jeszcze jakaś "sealed" klasa jako SinkHelper. Czy z poziomu PHP można mieć dostęp do tak skomplikowanych struktur obiektu COM ![]() Ten post edytował jarek_bolo 18.05.2015, 09:58:11 -------------------- "Jeden człowiek nie zmieni świata, ale jeden człowiek może przekazać informację która zmieni świat." - David Icke
| PAMIĘTAJ, JESTEŚ POLAKIEM !!! | Jam jest Polska, Ojczyzna Twoja, ziemia Ojców, z której wzrosłeś. Wszystko, czym jesteś, po Bogu - mnie zawdzięczasz!! |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 07:00 |