Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: LPT:n datalinjojen ohjaus vb:llä ?

Sivun loppuun

pauli [22.01.2003 09:22:00]

#

Rinnakkaisportin datalinjojen ohjaus suoraan ohjelmasta
onnistuu QB:llä OUT tempulla, mutta miten vastaava
homma onnistuu VB5:lla ?

Gwaur [22.01.2003 09:56:32]

#

Kaima!!

Antti [23.01.2003 09:50:51]

#

Jopas heitit visasen... Mietin asiaa ja ainoa kylmiltään mieleen tuli MSComm-ActiveX komponentti, mutta se ainakaan dokumentaation mukaan tuoe kuin sarjaportteja.

Printer-olio osaa lähettää sarjaporttiin tavaraa, muttei muutoin kykene ohjata datalinjoja.

WinAPI:sta pitäisi löytyä vastaus...

Jotain tälläistä koodia löysin kun pyyhin pölyjä...

Private Declare Function ConfigurePort Lib "winspool.drv" Alias "ConfigurePortA" (ByVal pName As String, ByVal hwnd As Long, ByVal pPortName As String) As Long

Private Sub Command1_Click()
     MsgBox ConfigurePort("", Me.hwnd, "COM1:")
     MsgBox ConfigurePort("", Me.hwnd, "LPT1:")
End Sub

Seuraava koodi ei ole omaa tavaraa vaan ladattu joskus jostain vihjelistalta (en muista mistä). Koodi pitäisi toimia vain 95,98 ja NT alustalla, siispä en edes vaivautunut tesstaamaan sitä W2000 - serverilläni.

Moduliin seuraava koodi:

Option Explicit

'API calls
Private Declare Function EnumPorts Lib "winspool.drv" Alias "EnumPortsA" (ByVal pName As String, ByVal Level As Long, ByVal lpbPorts As Long, ByVal cbBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long

Private Declare Function lstrlenW Lib "kernel32.dll" (ByVal lpString As Long) As Long
Private Declare Sub CopyMem Lib "kernel32.dll" Alias "RtlMoveMemory" (pTo As Any, uFrom As Any, ByVal lSize As Long)

Private Declare Function HeapAlloc Lib "kernel32.dll" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long

Private Declare Function GetProcessHeap Lib "kernel32.dll" () As Long

Private Declare Function HeapFree Lib "kernel32.dll" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long


'API Structures
Private Type PORT_INFO_2
    pPortName As String
    pMonitorName As String
    pDescription As String
    fPortType As Long
    Reserved As Long
End Type

Private Type API_PORT_INFO_2
    pPortName As Long
    pMonitorName As Long
    pDescription As Long
    fPortType As Long
    Reserved As Long
End Type

'Public Data Structure - up to 100 Ports Information
Public Ports(0 To 100) As PORT_INFO_2

Public Function TrimStr(strName As String) As String
    'Finds a null then trims the string
    Dim x As Integer

    x = InStr(strName, vbNullChar)
    If x > 0 Then TrimStr = Left(strName, x - 1) Else TrimStr = strName
End Function

Public Function LPSTRtoSTRING(ByVal lngPointer As Long) As String
    Dim lngLength As Long

    'Get number of characters in string
    lngLength = lstrlenW(lngPointer) * 2
    'Initialize string so we have something to copy the string into
    LPSTRtoSTRING = String(lngLength, 0)
    'Copy the string
    CopyMem ByVal StrPtr(LPSTRtoSTRING), ByVal lngPointer, lngLength
    'Convert to Unicode
    LPSTRtoSTRING = TrimStr(StrConv(LPSTRtoSTRING, vbUnicode))
End Function

'Use ServerName to specify the name of a Remote Workstation i.e. "//WIN95WKST"
'or leave it blank "" to get the ports of the local Machine
Public Function GetAvailablePorts(ServerName As String) As Long
    Dim ret As Long
    Dim PortsStruct(0 To 100) As API_PORT_INFO_2
    Dim pcbNeeded As Long
    Dim pcReturned As Long
    Dim TempBuff As Long
    Dim i As Integer

    'Get the amount of bytes needed to contain the data returned by the API call
    ret = EnumPorts(ServerName, 2, TempBuff, 0, pcbNeeded, pcReturned)
    'Allocate the Buffer
    TempBuff = HeapAlloc(GetProcessHeap(), 0, pcbNeeded)
    ret = EnumPorts(ServerName, 2, TempBuff, pcbNeeded, pcbNeeded, pcReturned)
    If ret Then
        'Convert the returned String Pointer Values to VB String Type
        CopyMem PortsStruct(0), ByVal TempBuff, pcbNeeded
        For i = 0 To pcReturned - 1
            Ports(i).pDescription = LPSTRtoSTRING(PortsStruct(i).pDescription)
            Ports(i).pPortName = LPSTRtoSTRING(PortsStruct(i).pPortName)
            Ports(i).pMonitorName = LPSTRtoSTRING(PortsStruct(i).pMonitorName)
            Ports(i).fPortType = PortsStruct(i).fPortType
        Next
    End If
    GetAvailablePorts = pcReturned
    'Free the Heap Space allocated for the Buffer
    If TempBuff Then HeapFree GetProcessHeap(), 0, TempBuff
End Function

Ja käyttö:

Option Explicit

'Create a Form with a Command Button and a List
Private Sub Command1_Click()
    Dim NumPorts As Long
    Dim i As Integer

    'Get the Numbers of Ports in the System
    'and Fill the Ports Structure
    NumPorts = GetAvailablePorts("")
    'Fill the List with the available Ports
    List1.Clear
    For i = 0 To NumPorts - 1
        List1.AddItem Ports(i).pPortName
    Next
End Sub

Olisiko noista jotain apua...

Pekka Kauppila [23.01.2003 14:04:47]

#

Olisi muuten erittäin kiva tietää miten se onnisttu kun käyttis on Windows 2000, ME tai XP.

Antti [23.01.2003 14:19:36]

#

Juu... niin varmaan....mitä sinun pitää tehdä on etsiä vastaavat kyseisten käyttöjärjestelmien vastaavat API-kutsut.

Pekka Kauppila [23.01.2003 14:40:39]

#

Olenpa monesti yrittänyt etsiä, mutta ilman tulosta. Eikä se nyt maailmaa kaada vaikka en sitä koskaan tietäisi. Kunhan kysyin jos joku sattuisi tietämään.

Antti [23.01.2003 15:56:43]

#

Joo... W98:lla ja NT-pohjaisilla Windowseilla NT4.0 ja W2000 on hieman eri kutsut - niissä on vain vähän eroa. MSDN kyllä kuvaa kaikki ja kertoo niinpäin missä käyttöjärjestelmässä mikäkin API-kutsu toimii, mutta sen vastaavaa W98:ssa tai W2000:ssa se ei kerro...

Teme [27.01.2003 18:40:23]

#

Täältä Ohjelmointiputkasta löytyy yksi esimerkki, en tiedä, että onko tämä tarvitsemasi mutta käy katsomassa:

https://www.ohjelmointiputka.net/koodivinkit/23777-vb6-sarjaportin-ohjaaminen-visual-basicella


Sivun alkuun

Vastaus

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

Tietoa sivustosta