はじめまして、充と申します。
恐縮ですが早速質問させてください。
今回、ダイヤルアップの専用線で接続してあるパソコン同士の
データのやり取りをすることになりました。
A地点にあるパソコン→モデム→[データ]→モデム→B地点にあるパソコン。
A地点にあるパソコン←モデム←[データ]←モデム←B地点にあるパソコン。
といった具合です。
開発ツールはVBで行おうとしています。
常時接続の専用線なら
なんとかなりそうなのですが
ダイヤルアップという状況では
どうしていいのか検討がつかないのです・・・。
上記データのやり取りは
自動で行えるのでしょうか?
やはり、まずはダイヤルアップ接続を人間が行って
それからボタンを押す等の行為をしないと
データのやり取りはできないのでしょうか?
おバカな質問で申し訳ないですが
以上、よろしくお願い致します。
一方でパソ通ホスト(KTBBS,BigModel,mmm,nnn,WWIV,絵里香など)を立ち上げ、
もう一方から秀TERM,WTERM,まいと〜く,CCTのような
パソ通ソフトでダイアルアップログインしてはどうでしょう?
XModemプロトコルやISHなどでバイナリデータも遅れます。
・・・ってVBいらないような・・・。
ネタも10年ぐらい昔だし・・・。
RasDialというAPI関数を使用すればプログラム上でダイヤルアップ接続ができるようです。
参考となるソース
リストボックス(List1) '設定されている接続名が表示される
テキストボックス(Text1) 'ユーザー名
テキストボックス(Text2) 'パスワード
コマンドボタン(Command1) '接続
が必要らしいですね。
で、これを実行するとリストボックスに設定されている接続名がリストアップ
されますので、該当する接続名を選択して、
テキストボックス(Text1)に、ユーザー名
テキストボックス(Text2)に、パスワード
を入力して
コマンドボタン(Command1)を押すとダイヤルアップ接続を行う
という流れらしいです。
ですので、自動的に接続したい場合は、プログラム内で接続名、ユーザー名、パスワードを設定して実行すればいいのではないでしょうか?
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, ByVal pSrc As String, ByVal ByteLen As Long)
Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (Destination As Any, ByVal Length As Long)
Const RAS95_MaxEntryName = 256
Const RAS_MaxPhoneNumber = 128
Const RAS_MaxCallbackNumber = RAS_MaxPhoneNumber
Const UNLEN = 256
Const PWLEN = 256
Const DNLEN = 12
Private Type RASDIALPARAMS
dwSize As Long ' 1052
szEntryName(RAS95_MaxEntryName) As Byte
szPhoneNumber(RAS_MaxPhoneNumber) As Byte
szCallbackNumber(RAS_MaxCallbackNumber) As Byte
szUserName(UNLEN) As Byte
szPassword(PWLEN) As Byte
szDomain(DNLEN) As Byte
End Type
Private Type RASENTRYNAME95
'set dwsize to 264
dwSize As Long
szEntryName(RAS95_MaxEntryName) As Byte
End Type
Private Declare Function RasDial Lib "rasapi32.dll" Alias "RasDialA" (ByVal lprasdialextensions As Long, ByVal lpcstr As String, ByRef lprasdialparamsa As RASDIALPARAMS, ByVal dword As Long, lpvoid As Any, ByRef lphrasconn As Long) As Long
Private Declare Function RasEnumEntries Lib "rasapi32.dll" Alias "RasEnumEntriesA" (ByVal reserved As String, ByVal lpszPhonebook As String, lprasentryname As Any, lpcb As Long, lpcEntries As Long) As Long
Private Declare Function RasGetEntryDialParams Lib "rasapi32.dll" Alias "RasGetEntryDialParamsA" (ByVal lpcstr As String, ByRef lprasdialparamsa As RASDIALPARAMS, ByRef lpbool As Long) As Long
Private Function Dial(ByVal Connection As String, ByVal UserName As String, ByVal Password As String) As Boolean
Dim rp As RASDIALPARAMS, h As Long, resp As Long
rp.dwSize = Len(rp) + 6
ChangeBytes Connection, rp.szEntryName
ChangeBytes "", rp.szPhoneNumber 'Phone number stored for the connection
ChangeBytes "*", rp.szCallbackNumber 'Callback number stored for the connection
ChangeBytes UserName, rp.szUserName
ChangeBytes Password, rp.szPassword
ChangeBytes "*", rp.szDomain 'Domain stored for the connection
'Dial
resp = RasDial(ByVal 0, ByVal 0, rp, 0, ByVal 0, h) 'AddressOf RasDialFunc
Dial = (resp = 0)
End Function
Private Function ChangeToStringUni(Bytes() As Byte) As String
'Changes an byte array to a Visual Basic unicode string
Dim temp As String
temp = StrConv(Bytes, vbUnicode)
ChangeToStringUni = Left(temp, InStr(temp, Chr(0)) - 1)
End Function
Private Function ChangeBytes(ByVal str As String, Bytes() As Byte) As Boolean
'Changes a Visual Basic unicode string to an byte array
'Returns True if it truncates str
Dim lenBs As Long 'length of the byte array
Dim lenStr As Long 'length of the string
lenBs = UBound(Bytes) - LBound(Bytes)
lenStr = LenB(StrConv(str, vbFromUnicode))
If lenBs > lenStr Then
CopyMemory Bytes(0), str, lenStr
ZeroMemory Bytes(lenStr), lenBs - lenStr
ElseIf lenBs = lenStr Then
CopyMemory Bytes(0), str, lenStr
Else
CopyMemory Bytes(0), str, lenBs 'Queda truncado
ChangeBytes = True
End If
End Function
Private Sub Command1_Click()
Dial List1.Text, Text1, Text2
End Sub
Private Sub List1_Click()
Dim rdp As RASDIALPARAMS, t As Long
rdp.dwSize = Len(rdp) + 6
ChangeBytes List1.Text, rdp.szEntryName
'Get User name and password for the connection
t = RasGetEntryDialParams(List1.Text, rdp, 0)
If t = 0 Then
Text1 = ChangeToStringUni(rdp.szUserName)
Text2 = ChangeToStringUni(rdp.szPassword)
End If
End Sub
Private Sub Form_Load()
'example created by Daniel Kaufmann (daniel@i.com.uy)
'load the connections
Text2.PasswordChar = "*"
Command1.Caption = "Dial"
Dim s As Long, l As Long, ln As Long, a$
ReDim r(255) As RASENTRYNAME95
r(0).dwSize = 264
s = 256 * r(0).dwSize
l = RasEnumEntries(vbNullString, vbNullString, r(0), s, ln)
For l = 0 To ln - 1
a$ = StrConv(r(l).szEntryName(), vbUnicode)
List1.AddItem Left$(a$, InStr(a$, Chr$(0)) - 1)
Next
If List1.ListCount > 0 Then
List1.ListIndex = 0
List1_Click
End If
End Sub
Sayさん、k.kさん、ありがとうございます!
Sayさんの案については
少し私には複雑すぎますので・・・申し訳ありません。
k.kさん、ご丁寧にソースまで載せて頂き
本当に感謝しています。
まだ理解はできてませんが・・・
少し希望が出てきました。
後は地道に調べつつ
作業していこうと思います。
本当にありがとうございました。
また、駄目だったらまた質問させて頂きます。