Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP, VB.NET: HttpSendRequestA

Sivun loppuun

jtha [21.06.2011 14:52:34]

#

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.

Grez [21.06.2011 16:39:20]

#

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ä.

jtha [21.06.2011 17:03:20]

#

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/tsekkaa.php", "POST"))

Merri [21.06.2011 17:24:46]

#

Oletko varmistanut ettei palomuuri blokkaa VB6:tta?

Tämä arvaus puhtaasti virhenumeron perusteella.

jtha [21.06.2011 17:44:40]

#

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.

jtha [21.06.2011 20:27:17]

#

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 :-(

Merri [22.06.2011 09:23:09]

#

Ainakin minua helpottaisi nähdä ihan se koodipätkä kokonaisuudessaan yhtenäisenä pötkönä, ei selitettynä saati pätkittynä käänteiseen järjestykseen.

neau33 [22.06.2011 09:38:23]

#

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;
   }
?>

jtha [22.06.2011 17:30:40]

#

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.

jtha [23.06.2011 10:18:41]

#

Iso kiitos, Nea. SE TOIMII!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta