星期五, 八月 08, 2008

vb.NET下获取命令行参数的方法

命令行参数允许用户或其他程序向程序传送启动信息。例如:程序名为test.exe,可以运行以下命令:
test.exe /help
在VB6中,可以使用Command属性读取它。在Vb.NET中,它已替换为System.Environment.GetCommandLineArgs函数,该函数返回一组传送的启动参数。
代码如下:
Dim myArg() As String, iCount As Integer
myArg = System.Environment.GetCommandLineArgs
For iCount = 0 To UBound(myArg)
TextBox1.Text = TextBox1.Text & "|" & myArg(iCount).ToString
Next

我的用法如下:
Imports System.Windows.forms
Module Module1

Sub Main()
Dim myArg() As String
Dim icount As Integer
myArg = System.Environment.GetCommandLineArgs
For icount = 0 To UBound(myArg)
MessageBox.Show(myArg(icount).ToString)
Next

End Sub

End Module
运行通过

星期六, 八月 02, 2008

用 vb.net 读写 ini 文件

Public Class Form1
' 这个有点不明白,为什么要这么做,
' 个人感觉都不如 xml 好用。
' 以后再研究
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, ByVal lpdefault As String, _
ByVal lpretrunedstring As String, ByVal nSize As Int32, _
ByVal lpFilename As String) As Int32

Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, ByVal lpString As String, _
ByVal lpFilename As String) As Int32


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
WritePrivateProfileString("AppName", "KeyB", "MyValue", "C:\a.ini")
WritePrivateProfileString("Port", "value", "11024", "c:\a.ini")

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim strIni As String
strIni = New String(" ", 100)
GetPrivateProfileString("AppName", "KeyB", "", strIni, 100, "c:\a.ini")
MsgBox(strIni)
End Sub
' vb.net 中读写 ini 文件和 vb6 中的做法是一致的,也要使用 Windows Api 的方法
' 唯一要注意的是:在 vb.net 中,api 声明中的 Long 型要改为 int32 类型。
End Class

用 VB.net 编写 Socket 通信程序

服务器端:

Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading

Public Class Form1
Dim s As Socket = Nothing
Dim t As Thread
' 新建一个线程,用于处理收到的Socket 数据包
Public Sub WaitData()
' 使用 TCP 协议
s = New Socket(AddressFamily.InterNetwork, _
SocketType.Stream, ProtocolType.Tcp)
' 定义 IP 和端口
Dim localEndPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 11024)
' 绑定到该 Socket
s.Bind(localEndPoint)
' 侦听,最多接收10个连接
s.Listen(10)
While (True)
' 用来储存接收到的字节
Dim bytes(1024) As Byte
' 若接收到,则创建一个新的 Socket 与之连接
Dim ss As Socket = s.Accept()
MessageBox.Show("ss connected = " & ss.Connected.ToString)
' 接收数据,若用 ss.send(byte()), 则发送数据
ss.Receive(bytes)
' 将其插入到列表的第一项之前
' 以下用法会弹出不安全线程访问错误
'ListBox1.Items.Insert(0, Encoding.Unicode.GetString(bytes))
' 对不带参数的方法的委托
Dim strGetS As String
strGetS = Encoding.Unicode.GetString(bytes)
BeginInvoke(New EventHandler(AddressOf AddInfo), strGetS)
' 若使用 Encoding.ASCII.GetString(bytes), 则接收到的中文字不能显示
End While
End Sub
Private Sub AddInfo(ByVal sender As Object, ByVal e As EventArgs)
ListBox1.Items.Insert(0, "消息>>> " & sender.ToString)
End Sub


Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
' btnStart 的 click 事件中,加入如下代码:
' 建立新的线程
t = New Thread(AddressOf WaitData)
' 启动线程:
t.Start()
' 按钮不可用,避免另起线程
btnStart.Enabled = False
End Sub

Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
' 在BtnStop的click事件中, 加入如下代码
Try
' 关闭 Socket
s.Close()
' 终止线程
t.Abort()
Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
' 启用按钮
btnStart.Enabled = True
End Try
End Sub

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
' 为了防止用户不点击Stop直接退出,而不能使线程结束,则应在窗体的closing事件中,加入如下代码:
Try
s.Close()
t.Abort()
Catch ex As Exception
MessageBox.Show(ex.ToString)

End Try

End Sub
End Class


客户机端:
Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class Form1

Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
Try
Dim bytes(1024) As Byte
Dim s As Socket
s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, _
ProtocolType.Tcp)
Dim localEndPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 11024)
s.Connect(localEndPoint)
If Not s.Connected Then
Dim strRetPage As String = "无法连接到远程主机"
MessageBox.Show(strRetPage)

Else
MessageBox.Show("s.Connected is " & s.Connected.ToString & vbCrLf)
s.Send(Encoding.Unicode.GetBytes(TextBox1.Text))
s.Close()

End If
Catch ex As Exception
'MessageBox.Show(ex.ToString)
MessageBox.Show("错、错、错")
End Try

End Sub
End Class


(完)