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
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
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__ */
Never mind. I stole the code from the Console Compiler's version of Echo Server and got it working.
I'm glad you got it working :)
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?
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