MSWINSCK and FireFly

Started by Frank Applin, March 03, 2011, 01:11:07 PM

Previous topic - Next topic

Frank Applin

Has anyone done any TCPIP work using the MSWINSCK include (part Jose' Roca's Windows API) in FireFly? If so, could you possibly post an example. I am trying to set up a simple TCP server.

Thanks,

Frank

Frank Applin

I am trying to make this example (from Jose' Roca) work in FireFly.

' ########################################################################################
' This example creates a TCP server that listen the port 1001.
'
' Compile TCP_Client.BAS and TCP_Server.BAS
' RUN TCP_Server.EXE - It will listen at port 1001
' RUN TCP_Client.EXE. Click the Connect button.
' Type some text in the input window of TCP_Client. It will be echoed in the output window
' of TCP_Server.
' Type some text in the input window of TCP_Server. It will be echoed in the output window
' of TCP_Client.
' ########################################################################################

' SED_PBWIN - Use the PBWIN compiler
#COMPILE EXE
#DIM ALL

#INCLUDE "mswinsck.inc"
#INCLUDE "ole2utils.inc"

%IDC_INPUT  = 1001
%IDC_OUTPUT = 1002

GLOBAL g_hDlg AS DWORD
GLOBAL pTcpServer AS IMSWinsockControl

' ========================================================================================
' Main
' ========================================================================================
FUNCTION WINMAIN (BYVAL hInstance AS DWORD, BYVAL hPrevInstance AS DWORD, BYVAL lpszCmdLine AS ASCIIZ PTR, BYVAL nCmdShow AS LONG) AS LONG

   LOCAL hDlg AS LONG

   DIALOG NEW 0, "Winsock TCP Chat Test - Server", 270, 70, 250, 240, %WS_OVERLAPPED OR %WS_THICKFRAME OR %WS_SYSMENU OR _
   %WS_MINIMIZEBOX OR %WS_MAXIMIZEBOX OR %WS_VISIBLE, %WS_EX_TOPMOST   TO hDlg
   ' For icon from resource, instead use something like, LoadIcon(hInst, "APPICON")
   DIALOG SEND hDlg, %WM_SETICON, %ICON_SMALL, LoadIcon(%NULL, BYVAL %IDI_APPLICATION)
   DIALOG SEND hDlg, %WM_SETICON, %ICON_BIG, LoadIcon(%NULL, BYVAL %IDI_APPLICATION)
   CONTROL ADD TEXTBOX, hDlg, %IDC_INPUT, "Type some text and it will echoed in the Client window", 5, 5, 388, 90, _
      %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %WS_VSCROLL OR %ES_MULTILINE, %WS_EX_CLIENTEDGE
   CONTROL ADD TEXTBOX, hDlg, %IDC_OUTPUT, "", 5, 100, 388, 90, _
      %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %WS_VSCROLL OR %ES_MULTILINE OR %ES_READONLY, %WS_EX_CLIENTEDGE

   CONTROL ADD BUTTON, hDlg, %IDCANCEL, "&Close", 0, 0, 50, 14, %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %BS_FLAT

   g_hDlg = hDlg

   DIALOG SHOW MODAL hDlg, CALL DlgProc

END FUNCTION
' ========================================================================================

' ========================================================================================
' Main Dialog procedure
' ========================================================================================
CALLBACK FUNCTION DlgProc() AS LONG

   LOCAL  rc AS RECT
   LOCAL  hr AS LONG
   LOCAL  strText AS STRING
   STATIC pTcpServerEvents AS DMSWinsockControlEventsImpl


   SELECT CASE CB.MSG

      CASE %WM_INITDIALOG
         ' Create a registration-free instance of the control
         pTcpServer = CreateInstanceFromDll(EXE.Path$ & "MSWINSCK.OCX", $CLSID_Winsock, $IID_IMSWinsockControl, $RTLKEY_Winsock)
         IF ISOBJECT(pTcpServer) THEN
            ' Connect to the events fired by the control
            pTcpServerEvents = CLASS "CDMSWinsockControlEvents"
            IF ISOBJECT(pTcpServerEvents) THEN EVENTS FROM pTcpServer CALL pTcpServerEvents
            ' Set the UDP protocol
            pTcpServer.Protocol = %sckTCPProtocol
            ' Set the remote port
            pTcpServer.LocalPort = 1001
            ' Call the Listen method
            pTcpServer.Listen
         END IF

      CASE %WM_SIZE
         ' Resize the two sample buttons of the dialog
         IF CB.WPARAM <> %SIZE_MINIMIZED THEN
            GetClientRect CBHNDL, rc
            MoveWindow GetDlgItem(CB.HNDL, %IDC_INPUT), 10, 10, (rc.nRight - rc.nLeft) - 20, ((rc.nBottom - rc.nTop) \ 2) - 40, %TRUE
            MoveWindow GetDlgItem(CB.HNDL, %IDC_OUTPUT), 10, ((rc.nBottom - rc.nTop) \ 2) - 20, (rc.nRight - rc.nLeft) - 20, ((rc.nBottom - rc.nTop) \ 2) - 40, %TRUE
            MoveWindow GetDlgItem(CB.HNDL, %IDCANCEL), (rc.nRight - rc.nLeft) - 95, (rc.nBottom - rc.nTop) - 35, 75, 23, %TRUE
         END IF

      CASE %WM_COMMAND
         SELECT CASE CB.CTL
            CASE %IDCANCEL
               IF CB.CTLMSG = %BN_CLICKED THEN DIALOG END CB.HNDL, 0
            CASE %IDC_INPUT
               IF CB.CTLMSG = %EN_CHANGE THEN
                  ' Retrieve the text of the input window
                  CONTROL GET TEXT CB.HNDL, %IDC_INPUT TO strText
                  ' Send the text
                  pTcpServer.SendData strText
               END IF
         END SELECT

      CASE %WM_DESTROY
         ' Close the connection
         IF pTcpServer.State <> %sckClosed THEN
            pTcpServer.Close
         END IF
         ' Disconnect events
         IF ISOBJECT(pTcpServerEvents) THEN EVENTS END pTcpServerEvents
         ' Release the control
         IF ISOBJECT(pTcpServer) THEN pTcpServer = NOTHING

   END SELECT

END FUNCTION
' ========================================================================================


' ########################################################################################
' Class CDMSWinsockControlEvents
' Interface name = DMSWinsockControlEvents
' IID = {248DD893-BB45-11CF-9ABC-0080C7E7B78D}
' Microsoft Winsock Control events
' Attributes = 4112 [&H1010] [Hidden] [Dispatchable]
' Code generated by the TypeLib Browser 4.0.13 (c) 2008 by Jose Roca
' Date: 18 dic 2008   Time: 01:54:58
' ########################################################################################

CLASS CDMSWinsockControlEvents GUID$("{5DBC24EC-EEEB-4F33-BBD9-D1BEFACA501D}") AS EVENT

INTERFACE DMSWinsockControlEventsImpl GUID$("{248DD893-BB45-11CF-9ABC-0080C7E7B78D}") AS EVENT

  INHERIT IDispatch

   ' =====================================================================================
   METHOD Error <6> ( _
     BYVAL Number AS INTEGER _                          ' Number VT_I2 <Integer>
   , BYREF Description AS STRING _                      ' *Description VT_BSTR
   , BYVAL Scode AS LONG _                              ' Scode VT_I4 <Long>
   , BYVAL bstrSource AS STRING _                       ' Source VT_BSTR
   , BYVAL HelpFile AS STRING _                         ' HelpFile VT_BSTR
   , BYVAL HelpContext AS LONG _                        ' HelpContext VT_I4 <Long>
   , BYREF CancelDisplay AS INTEGER _                   ' *CancelDisplay VT_BOOL <Integer>
   )                                                    ' void

     SetWindowText g_Hdlg, "Error " & FORMAT$(Scode) & " - " & ACODE$(Description)

   END METHOD
   ' =====================================================================================

   ' =====================================================================================
   METHOD DataArrival <0> ( _
     BYVAL bytesTotal AS LONG _                         ' bytesTotal VT_I4 <Long>
   )                                                    ' void

      ' Retrieve the text received and output it in the output window
      LOCAL vData AS VARIANT
      pTcpServer.GetData vData, 8   ' %vbString = 8
      CONTROL SET TEXT g_hDlg, %IDC_OUTPUT, VARIANT$(vData)

   END METHOD
   ' =====================================================================================

   ' =====================================================================================
   METHOD Connect <1>

      SetWindowText g_Hdlg, "Connect"

   END METHOD
   ' =====================================================================================

   ' =====================================================================================
   METHOD ConnectionRequest <2> ( _
     BYVAL requestID AS LONG _                          ' requestID VT_I4 <Long>
   )                                                    ' void

      ' Check if the control's State is closed. If not, close the connection
      ' before accepting the new connection.
      IF pTcpServer.State <> %sckClosed THEN pTcpServer.Close

      ' Accept the request with the requestID parameter.
      pTcpServer.Accept requestID
      SetWindowText g_Hdlg, "ConnectionRequest - requestID: " & FORMAT$(requestID)

   END METHOD
   ' =====================================================================================

   ' =====================================================================================
   METHOD Close <5>

      SetWindowText g_Hdlg, "Close"

   END METHOD
   ' =====================================================================================

   ' =====================================================================================
   METHOD SendProgress <3> ( _
     BYVAL bytesSent AS LONG _                          ' bytesSent VT_I4 <Long>
   , BYVAL bytesRemaining AS LONG _                     ' bytesRemaining VT_I4 <Long>
   )                                                    ' void

     ' *** Insert your code here ***

   END METHOD
   ' =====================================================================================

   ' =====================================================================================
   METHOD SendComplete <4>

     ' *** Insert your code here ***

   END METHOD
   ' =====================================================================================

END INTERFACE

END CLASS


Frank Applin

Or is there a way to use the OCX in FireFly? Here's what comes from the TypeLib Browser:

' ########################################################################################
' Library name: MSWinsockLib
' Version: 1.0, Locale ID = 0
' Documentation string: Microsoft Winsock Control 6.0
' Path: C:\Windows\SysWOW64\MSWINSCK.OCX
' Library GUID: {248DD890-BB45-11CF-9ABC-0080C7E7B78D}
' Help file: C:\Windows\SysWOW64\MSWNSK98.chm
' Code generated by the TypeLib Browser 4.0.13 (c) 2008 by Jose Roca
' Date: 03 Mar 2011   Time: 15:06:07
' ########################################################################################

' ========================================================================================
' ProgIDs (Program identifiers)
' ========================================================================================

' CLSID = {248DD896-BB45-11CF-9ABC-0080C7E7B78D}
$PROGID_Winsock1 = "MSWinsock.Winsock.1"

' ========================================================================================
' Version independent ProgIDs
' ========================================================================================

' CLSID = {248DD896-BB45-11CF-9ABC-0080C7E7B78D}
$PROGID_Winsock = "MSWinsock.Winsock"

' ========================================================================================
' ClsIDs (Class identifiers)
' ========================================================================================

$CLSID_Winsock = GUID$("{248DD896-BB45-11CF-9ABC-0080C7E7B78D}")

' ========================================================================================
' IIDs (Interface identifiers)
' ========================================================================================

$IID_DMSWinsockControlEvents = GUID$("{248DD893-BB45-11CF-9ABC-0080C7E7B78D}")
$IID_IMSWinsockControl = GUID$("{248DD892-BB45-11CF-9ABC-0080C7E7B78D}")

' ========================================================================================
' ProtocolConstants enum
' IID: {248DD895-BB45-11CF-9ABC-0080C7E7B78D}
' Protocol Constants
' ========================================================================================

%sckTCPProtocol                                         = 0            ' &H0
%sckUDPProtocol                                         = 1            ' &H1

' ========================================================================================
' StateConstants enum
' IID: {248DD894-BB45-11CF-9ABC-0080C7E7B78D}
' State Constants
' ========================================================================================

%sckClosed                                              = 0            ' &H0
%sckOpen                                                = 1            ' &H1
%sckListening                                           = 2            ' &H2
%sckConnectionPending                                   = 3            ' &H3
%sckResolvingHost                                       = 4            ' &H4
%sckHostResolved                                        = 5            ' &H5
%sckConnecting                                          = 6            ' &H6
%sckConnected                                           = 7            ' &H7
%sckClosing                                             = 8            ' &H8
%sckError                                               = 9            ' &H9

' ========================================================================================
' ErrorConstants enum
' IID: {248DD891-BB45-11CF-9ABC-0080C7E7B78D}
' Error Constants
' ========================================================================================

%sckInvalidPropertyValue                                = 380          ' &H17C
%sckGetNotSupported                                     = 394          ' &H18A
%sckSetNotSupported                                     = 383          ' &H17F
%sckOutOfMemory                                         = 7            ' &H7
%sckBadState                                            = 40006        ' &H9C46
%sckInvalidArg                                          = 40014        ' &H9C4E
%sckSuccess                                             = 40017        ' &H9C51
%sckUnsupported                                         = 40018        ' &H9C52
%sckInvalidOp                                           = 40020        ' &H9C54
%sckOutOfRange                                          = 40021        ' &H9C55
%sckWrongProtocol                                       = 40026        ' &H9C5A
%sckOpCanceled                                          = 10004        ' &H2714
%sckInvalidArgument                                     = 10014        ' &H271E
%sckWouldBlock                                          = 10035        ' &H2733
%sckInProgress                                          = 10036        ' &H2734
%sckAlreadyComplete                                     = 10037        ' &H2735
%sckNotSocket                                           = 10038        ' &H2736
%sckMsgTooBig                                           = 10040        ' &H2738
%sckPortNotSupported                                    = 10043        ' &H273B
%sckAddressInUse                                        = 10048        ' &H2740
%sckAddressNotAvailable                                 = 10049        ' &H2741
%sckNetworkSubsystemFailed                              = 10050        ' &H2742
%sckNetworkUnreachable                                  = 10051        ' &H2743
%sckNetReset                                            = 10052        ' &H2744
%sckConnectAborted                                      = 10053        ' &H2745
%sckConnectionReset                                     = 10054        ' &H2746
%sckNoBufferSpace                                       = 10055        ' &H2747
%sckAlreadyConnected                                    = 10056        ' &H2748
%sckNotConnected                                        = 10057        ' &H2749
%sckSocketShutdown                                      = 10058        ' &H274A
%sckTimedout                                            = 10060        ' &H274C
%sckConnectionRefused                                   = 10061        ' &H274D
%sckNotInitialized                                      = 10093        ' &H276D
%sckHostNotFound                                        = 11001        ' &H2AF9
%sckHostNotFoundTryAgain                                = 11002        ' &H2AFA
%sckNonRecoverableError                                 = 11003        ' &H2AFB
%sckNoData                                              = 11004        ' &H2AFC

' ########################################################################################
' Interface name = IMSWinsockControl
' IID = {248DD892-BB45-11CF-9ABC-0080C7E7B78D}
' Winsock methods and events
' Attributes = 4304 [&H10D0] [Hidden] [Dual] [Nonextensible] [Dispatchable]
' Inherited interface = IDispatch
' ########################################################################################

#IF NOT %DEF(%IMSWinsockControl_INTERFACE_DEFINED)
    %IMSWinsockControl_INTERFACE_DEFINED = 1

INTERFACE IMSWinsockControl $IID_IMSWinsockControl

   INHERIT IDispatch

   ' =====================================================================================
   METHOD AboutBox <-552> ( _                           ' VTable offset = 28
   )                                                    ' void
   ' =====================================================================================
   PROPERTY GET Protocol <3> ( _                        ' VTable offset = 32
   ) AS LONG                                            ' [retval][out] *Protocol ProtocolConstants <enum>
   ' =====================================================================================
   PROPERTY SET Protocol <3> ( _                        ' VTable offset = 36
     BYVAL prm_Protocol AS LONG _                       ' [in] Protocol ProtocolConstants <enum>
   )                                                    ' void
   ' =====================================================================================
   PROPERTY GET RemoteHostIP <4> ( _                    ' VTable offset = 40
   ) AS STRING                                          ' [retval][out] *RemoteHostIP VT_BSTR
   ' =====================================================================================
   PROPERTY GET LocalHostName <5> ( _                   ' VTable offset = 44
   ) AS STRING                                          ' [retval][out] *LocalHostName VT_BSTR
   ' =====================================================================================
   PROPERTY GET LocalIP <6> ( _                         ' VTable offset = 48
   ) AS STRING                                          ' [retval][out] *LocalIP VT_BSTR
   ' =====================================================================================
   PROPERTY GET SocketHandle <7> ( _                    ' VTable offset = 52
   ) AS LONG                                            ' [retval][out] *SocketHandle VT_I4 <Long>
   ' =====================================================================================
   PROPERTY GET RemoteHost_ <0> ( _                     ' VTable offset = 56
   ) AS STRING                                          ' [retval][out] *RemoteHost VT_BSTR
   ' =====================================================================================
   PROPERTY SET RemoteHost_ <0> ( _                     ' VTable offset = 60
     BYVAL prm_RemoteHost AS STRING _                   ' [in] RemoteHost VT_BSTR
   )                                                    ' void
   ' =====================================================================================
   PROPERTY GET RemotePort <1> ( _                      ' VTable offset = 64
   ) AS LONG                                            ' [retval][out] *RemotePort VT_I4 <Long>
   ' =====================================================================================
   PROPERTY SET RemotePort <1> ( _                      ' VTable offset = 68
     BYVAL prm_RemotePort AS LONG _                     ' [in] RemotePort VT_I4 <Long>
   )                                                    ' void
   ' =====================================================================================
   PROPERTY GET LocalPort <2> ( _                       ' VTable offset = 72
   ) AS LONG                                            ' [retval][out] *LocalPort VT_I4 <Long>
   ' =====================================================================================
   PROPERTY SET LocalPort <2> ( _                       ' VTable offset = 76
     BYVAL prm_LocalPort AS LONG _                      ' [in] LocalPort VT_I4 <Long>
   )                                                    ' void
   ' =====================================================================================
   PROPERTY GET State <8> ( _                           ' VTable offset = 80
   ) AS INTEGER                                         ' [retval][out] *State VT_I2 <Integer>
   ' =====================================================================================
   PROPERTY GET BytesReceived <9> ( _                   ' VTable offset = 84
   ) AS LONG                                            ' [retval][out] *BytesReceived VT_I4 <Long>
   ' =====================================================================================
   METHOD Connect <64> ( _                              ' VTable offset = 88
     OPTIONAL BYVAL prm_RemoteHost AS VARIANT _         ' [opt][in] RemoteHost VT_VARIANT <Variant>
   , OPTIONAL BYVAL prm_RemotePort AS VARIANT _         ' [opt][in] RemotePort VT_VARIANT <Variant>
   )                                                    ' void
   ' =====================================================================================
   METHOD Listen <65> ( _                               ' VTable offset = 92
   )                                                    ' void
   ' =====================================================================================
   METHOD Accept <66> ( _                               ' VTable offset = 96
     BYVAL prm_requestID AS LONG _                      ' [in] requestID VT_I4 <Long>
   )                                                    ' void
   ' =====================================================================================
   METHOD SendData <67> ( _                             ' VTable offset = 100
     BYVAL prm_data AS VARIANT _                        ' [in] data VT_VARIANT <Variant>
   )                                                    ' void
   ' =====================================================================================
   METHOD GetData <68> ( _                              ' VTable offset = 104
     BYREF prm_data AS VARIANT _                        ' [in][out] *data VT_VARIANT <Variant>
   , OPTIONAL BYVAL prm_type AS VARIANT _               ' [opt][in] type VT_VARIANT <Variant>
   , OPTIONAL BYVAL prm_maxLen AS VARIANT _             ' [opt][in] maxLen VT_VARIANT <Variant>
   )                                                    ' void
   ' =====================================================================================
   METHOD PeekData <69> ( _                             ' VTable offset = 108
     BYREF prm_data AS VARIANT _                        ' [in][out] *data VT_VARIANT <Variant>
   , OPTIONAL BYVAL prm_type AS VARIANT _               ' [opt][in] type VT_VARIANT <Variant>
   , OPTIONAL BYVAL prm_maxLen AS VARIANT _             ' [opt][in] maxLen VT_VARIANT <Variant>
   )                                                    ' void
   ' =====================================================================================
   METHOD Close <70> ( _                                ' VTable offset = 112
   )                                                    ' void
   ' =====================================================================================
   METHOD Bind <71> ( _                                 ' VTable offset = 116
     OPTIONAL BYVAL prm_LocalPort AS VARIANT _          ' [opt][in] LocalPort VT_VARIANT <Variant>
   , OPTIONAL BYVAL prm_LocalIP AS VARIANT _            ' [opt][in] LocalIP VT_VARIANT <Variant>
   )                                                    ' void
   ' =====================================================================================
   PROPERTY GET RemoteHost <10> ( _                     ' VTable offset = 120
   ) AS STRING                                          ' [retval][out] *RemoteHost VT_BSTR
   ' =====================================================================================
   PROPERTY SET RemoteHost <10> ( _                     ' VTable offset = 124
     BYVAL prm_RemoteHost AS STRING _                   ' [in] RemoteHost VT_BSTR
   )                                                    ' void
   ' =====================================================================================

END INTERFACE

#ENDIF   ' /* __IMSWinsockControl_INTERFACE_DEFINED__ */


Frank Applin

Never mind. I stole the code from the Console Compiler's version of Echo Server and got it working.

David Maruca

I'm glad you got it working :)

Martin Francom

Quote from: Frank Applin on March 03, 2011, 04:56:43 PM
Never mind. I stole the code from the Console Compiler's version of Echo Server and got it working.

Frank, could you post an example program?

Frank Applin

Well, since I don't have an FTP server (and it doesn't look as if I can attach a zip file) - here is my e-mail address: frankapplin@yahoo.com. I'll send you the little zip file.

Frank