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.