Moikka (Nea oletko kuulolla :-)
Taannoin oli juttua siitä USB-tikun suojauksesta. Jäi aikaa kokeilla
Nean antamaa esimerkkikoodia. Tietty tuli tarvetta kysäistä taas lisää:
Tilanne on tämä:
Minulla on Vertrigo palvelin 'B'-koneella ja se näyttää toimivan ihan hyvin.
Tein sinne www hakemistoon .php failin, jota kutsun 'A'-koneelta.
A-koneella VB6 sovellus, joka käyttää mm. alla olevaa funktiota:
(Private Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal Headers As String, ByVal HeadersLength As Long, ByVal sOptional As String, ByVal OptionalLength As Long) As Boolean) jne. jne.
Tämä fuktio palauttaa FALSE
A-koneen selaimella kutsuessani palauttaa simppelisti sen mitä PHP:ssä lukeekin.
php on simppelisti tällainen:
<?php
echo "vastaus";
?>
Mitä pitäisi lisätä, jotta VB6:n funktio HttpSendRequestA palauttaisi TRUE ?
Olen kokeillut netistä löytämiä esimerkkejä, mutta tähän se on aina tökännyt.
Haluaisin testata VB sovelluksen valmiiksi ennen kuin lähden kehittämään PHP:tä, joka on minulle täysin vieras.
jtha kirjoitti:
Mitä pitäisi lisätä, jotta VB6:n funktio HttpSendRequestA palauttaisi TRUE ?
Se ei ole VB6:n funktio, vaan wininet.dll:n funktio.
Dokumentaatio kirjoitti:
Returns TRUE if successful, or FALSE otherwise. To get extended error information, call GetLastError.
Eli jotta sen saisi palauttamaan true, täytyisi antaa kelvolliset syötteet. Kannattaa katsoa getlasterrorilla mikä se virhe itse asiassa on. Ja jotta täällä joku osaisi vastata jotain, voisit myös kertoa millä parametreillä kutsut ko. funktiota ja millä tavalla olet esimerkiksi muodostanut tuon handlen pyyntöön (ensimmäinen parametri)
Onko jotain erityistä syytä käyttää VB6:sta? Kaikki nettiin liittyvät jutut olisi C#:lla (tai VB.Netillä) ziljoona kertaa helpompia. Itselläni on vieläkin satoja tuhansia rivejä VB6-koodia odottamassa porttausta C#:ksi, niin tuntuisi järjenvastaiselta tehdä lisää sellaista ilman merkittävää syytä.
Juu, wininet.dll on käytössä, Nean esimerkin mukaisesti. Kutsuessani tuota funktiota parametrit ovat näin:
HttpSendRequest(hRequest, Header, Len(Header), POSTData, Len(POSTData))
jossa:
hRequest = HttpOpenRequest(hConnection, Method, File, "HTTP/1.1", "", 0, Flags, 0)
(hRequest= 13369356)
Header = "Content-Type: application/x-www-form-urlencoded"
POSTData = "lisenssi=JTH%2DAutomaatio"
Olen yrittänyt PHP:ssä regoida tuohon 'lisenssiinkin' kuten Nean esimerkissä,
mutta en ole onnistunut saamaan palautuksena tästä funktiosta TRUE.
Oletan että tuo PHP tällä hetkellä on pahasti viallinen ja/tai puutteellinen
PS;
(Tämä MyHTPClass modulissa:
Private Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal Headers As String, ByVal HeadersLength As Long, ByVal sOptional As String, ByVal OptionalLength As Long) As Boolean)
LISÄYS: POST pois niin LastDllError on 12029 muuten 0
(xhttp.SendRequest("http://192.168.0.115/
Oletko varmistanut ettei palomuuri blokkaa VB6:tta?
Tämä arvaus puhtaasti virhenumeron perusteella.
Merri: Katsoin Nortonin palomuurin ja siellä oli asetukset VB6:lle "AUTO" kuten muillekin ohjelmille. Firfox pääsee läpi samoilla asetuksilla joten ei ehkä johdu siitä? HttpOpenRequest palauttaa kaikissa tapauksissa FALSE, vaikka ei Erroria olisikaan.
Näyttää siltä että VB koodissa on jotakin väärin - jatkan harjoittelua. A-koneen selaimet näyttävät palautteen niin kuin pitääkin.
Käänsin VB-sovelluksen exeksi ja ajoin tikulta B-koneella(jossa palvelin on) ja antoi palautteeksi HTML-koodia jossa mm. "Forbidden" jne. Palautti siis kuitenkin jotakin, toisin kuin A-koneelta ajettuna.
Oma osaaminen loppui kyllä tähän :-(
Ainakin minua helpottaisi nähdä ihan se koodipätkä kokonaisuudessaan yhtenäisenä pötkönä, ei selitettynä saati pätkittynä käänteiseen järjestykseen.
Moi taas jtha!
Kaytä MSXML2.ServerXMLHTTP objektia...
'Form1 Private Declare Function GetDriveType Lib "kernel32" _ Alias "GetDriveTypeA" (ByVal nDrive As String) As Long Dim oHTTP Private Sub Form_Load() TsekkaaOikeudet 'testi MsgBox "jee" '... End Sub Private Sub TsekkaaOikeudet() If Not Internet.Connected Then MsgBox "Ei Internet-yhteyttä!" End End If Dim root As String root = Left(App.Path, 3) Dim msg As String If GetDriveType(root) <> 2 Then MsgBox "EI KÄYTTÖOIKEUTTA!" End End If Dim driveletter As String driveletter = UCase(Left(root, 1)) Select Case driveletter Case "A", "B" msg = Space(25) & "EI KÄYTTÖOIKEUTTA!" Case Else End Select Dim fullpath As String fullpath = root & "mydrive.dat" If Dir(fullpath) <> "" Then Kill fullpath End If Shell "cmd /C dir root >" & fullpath, vbHide JumpBack: On Error Resume Next flen& = FileLen(fullpath) If Err <> 0 Then Err.Clear On Error GoTo 0 GoTo JumpBack End If Do While FileLen(fullpath) = 0 DoEvents: Loop Dim rootdata As String Open fullpath For Input As #1 Do While Not LOF(1) Input #1, rootdata If InStr(rootdata, "Aseman sarjanumero on") > 0 Then rootdata = Trim(Replace(rootdata, _ "Aseman sarjanumero on", "")) Exit Do End If Loop Close #1 Shell "cmd /C del " & fullpath, vbHide Set oHTTP = CreateObject("MSXML2.ServerXMLHTTP") URL = "http://www.palvelimesi.fi/kansio/tsekkaa.php?lisenssi=" & rootdata oHTTP.Open "POST", URL, False oHTTP.setRequestHeader "User-Agent", _ "Mozilla/5.0 (Windows; U; Windows NT 6.1; fi; rv:1.9.0.10) " + _ "Gecko/2009042316 Firefox/3.0.10 (.NET CLR 4.0.20506)" oHTTP.setRequestHeader "Content-Type", "text/xml" oHTTP.send Dim response As String response = oHTTP.responseTEXT Set oHTTP = Nothing If InStr(response, vbCrLf) > 0 Then Dim temp() As String temp = Split(response, vbCrLf) response = temp(0) Erase temp End If If Trim(response) = "valid license" Then Exit Sub ElseIf Trim(response) = "nolicense" Then msg = Space(25) & "EI KÄYTTÖOIKEUTTA!" ElseIf Trim(response) = "expired" Then msg = Space(20) & "KÄYTTÖOIKEUS PÄÄTTYNYT!" ElseIf InStr(response, "daysleft") > 0 Then Dim daysleft As String daysleft = Trim(Replace(response, "daysleft", "")) MsgBox "KÄYTTÖOIKEUS VANHENEE " & daysleft & " PÄIVÄN KULUTTUA!" Exit Sub ElseIf Trim(response) = "" Then msg = Space(25) & "PALVELIN EI VASTAA" End If If msg <> "" Then Dim msgresult As Long msg = msg & vbCrLf & vbCrLf & _ "Tahdotko siirtyä ohjelman toimittajan Internet sivustolle?" msgresult = MsgBox(msg, vbYesNo, Me.Caption) If msgresult = 6 Then Shell "explorer http://www.palvelimesi.com/sivustosi", vbNormalFocus End If End End If End Sub
'Module1 Private Declare Function InternetGetConnectedState Lib _ "wininet.dll" (ByRef lpSFlags As Long, ByVal dwReserved As Long) As Long Public Type InternetConnection Connected As Boolean End Type Public Function Internet() As InternetConnection Dim cType As Long Internet.Connected = InternetGetConnectedState(cType, 0&) End Function
MySql tietokantataulun rakenne Taulu nimi: lisenssit Kentät: id, notnull, primarykey, autoincremet, serial varchar(30), unique expires datetime, defaulvalue 0000-00-00 00:00:00
<?php //tsekkaa.php (www.palvelimelle) if(!isset($_POST["lisenssi"])) { $serial = $_GET["lisenssi"]; $mysql_host = "mysqlpalvelimesi_osoite"; //(web-hotelleissa usein: localhost) $mysql_user = "käyttäjätunnuksesi"; $mysql_password = "salasanasi"; $mysql_database = "tietokannan_nimi"; $conn = mysql_connect($mysql_host, $mysql_user, $mysql_password) or die(mysql_error()); mysql_select_db($mysql_database, $conn) or die(mysql_error()); $sql = "SELECT * FROM lisenssit WHERE serial='$serial'"; $result = mysql_query($sql, $conn) or die(mysql_error()); if (mysql_fetch_row($result)==null) { echo "nolicense"; } else { $today = date( "Y-m-d H:m:s"); if (mysql_result($result, 0, "expires") == null || mysql_result($result, 0, "expires") == "0000-00-00 00:00:00" ) { $datex = strtotime(date("Y-m-d H:m:s", strtotime($today)) . "+1 year"); $datex = date('Y-m-d', $datex); $sql = "UPDATE lisenssit SET expires='$datex' WHERE serial='$serial'"; $result2 = mysql_query($sql, $conn) or die(mysql_error()); if($result2) { echo "valid license"; } } else { $expiration = mysql_result($result, 0, "started"); $fullDays = date_diff($today, $expiration); if ((int)$fullDays <= 0) { echo "expired"; } elseif((int)$fullDays > 0 && (int)$fullDays < 11) { echo "daysleft" + $fullDays; } elseif((int)$fullDays > 10) { echo "valid license"; } } } } function date_diff($start, $end="NOW") { $sdate = strtotime($start); $edate = strtotime($end); $time = $edate - $sdate; if($time>=86400) { $pday = ($edate - $sdate) / 86400; $preday = explode('.',$pday); $timeshift = $preday[0]; } return $timeshift; } ?>
Kiitos, Nea. Koetan kun saan aikaa.
(Kolopallo tahtoo viedä leijonan osan ajasta, ellei sada.)
Tämä koodi näyttää hyvin paljon samalta kuin entinenkin.
"MSXML2.ServerXMLHTTP" on erilaista.
Iso kiitos, Nea. SE TOIMII!
Aihe on jo aika vanha, joten et voi enää vastata siihen.