ms access vbaWinsockコードを機能させる方法
以下のMsAccess VBAコードが機能することを確認するためにサポートが必要です.まだ何も機能していないことを試しましたが、誰かがここで支援できる可能性があります:
オプション比較データベース
オプション明示的
Public Const comMAND_ERROR=-1
Public Const RECV_ERROR=-1
Public Const NO_ERROR= 0
Public socketId As Long
'WINSOCKのグローバル変数
整数としてのグローバル状態
Sub CloseConnection()
Dim x As Long
'ここで接続を閉じます
x= closesocket(socketId)
x= SOCKET_ERRORの場合
MsgBox( "エラー:closesocket="+ Str $(x))
サブを終了
終了する場合
サブの終了
Sub EndIt()
Dim x As Long
'WinsockDLLをシャットダウンします
x= WSACleanup()
サブの終了
関数OpenSocket(ByVal Hostname As String、ByVal PortNumber As Integer)As Integer
Dim I_SocketAddress As sockaddr_in
Dim ipAddress As Long
Dim x As Long
ipAddress= inet_addr(Hostname)
'新しいソケットを作成します
socketId= socket(AF_INET、SOCK_STREAM、0)
socketId= SOCKET_ERROR Then
の場合MsgBox( "エラー:socket="+ Str $(socketId))
OpenSocket= comMAND_ERROR
終了機能
終了する場合
'サーバーへの接続を開きます
I_SocketAddress.sin_family= AF_INET
I_SocketAddress.sin_port= htons(PortNumber)
I_SocketAddress.sin_addr= ipAddress
I_SocketAddress.sin_zero= String $(8、0)
x= connect(socketId、I_SocketAddress、Len(I_SocketAddress))
socketId= SOCKET_ERROR Then
の場合MsgBox( "エラー:接続="+ Str $(x))
OpenSocket= comMAND_ERROR
終了機能
終了する場合
OpenSocket= socketId
終了機能
関数Sendcommand(ByValコマンドAs String)As Integer
'私たちの通信コマンド...
文字列としてstrSendを暗くする
薄暗いカウントは長い
strSend=コマンド+ vbCrLf
count= send(socketId、ByVal strSend、Len(strSend)、0)
count= SOCKET_ERROR Then
の場合MsgBox( "エラー:send="+ Str $(count))
Sendcommand= comMAND_ERROR
終了機能
終了する場合
Sendcommand= NO_ERROR
終了機能
関数RecvAscii(dataBuf As String、ByVal maxLength As Integer)As Integer
エラー時GoToError_Handler
DoEvents
Dim c As String* 12288
整数としての薄暗い長さ
dataBuf= ""
DoEvents
dataBuf= recv(socketId、c、12288、0)
dataBuf= c
長さ= Len(dataBuf)
終了機能
Error_Handler:
DoEvents
MsgBox Err.Number&""&Err.Description
DoEvents
終了機能
関数initWinsock()As Boolean '{
薄暗いwsaVersionAs Long
wsaVersion= 257
薄暗いrc長い間
WSADataとしての薄暗いwsa
rc= WSAStartup(wsaVersion、wsa)
If rc<>0 Then
initWinsock= False
終了機能
終了する場合
initWinsock= True
関数の終了 '}
VBAベースコード
オプション比較データベース
オプション明示的
'これは、VisualBasic用のWinsockAPI定義ファイルです
'WSAStartupコマンドの変数タイプ' hostent 'をセットアップします
Hostentと入力します
h_name As Long
h_aliases As Long
h_addrtype As String* 2
h_length As String* 2
h_addr_list As Long
終了タイプ
Public Const SZHOSTENT= 16
'インターネットアドレスタイプを長整数(32ビット)に設定します
in_addrと入力します
s_addr As Long
終了タイプ
'WinsockのCヘッダーファイルに精通している人へのメモ
'Visual Basicでは、ユーザー定義の変数タイプは許可されていません
'戻り構造として使用されます.
の場合'以下の変数定義、sin_addrは
'ユーザー定義ではなく長整数として宣言されます
'in_addrの変数タイプ.
sockaddr_in
と入力しますsin_family As Integer
sin_port As Integer
sin_addr As Long
sin_zero As String* 8
終了タイプ
Public Const WSADESCRIPTION_LEN= 256
Public Const WSASYS_STATUS_LEN= 128
Public Const WSA_DescriptionSize= WSADESCRIPTION_LEN + 1
Public Const WSA_SysStatusSize= WSASYS_STATUS_LEN + 1
'から返される情報の構造を設定します
'WSAStartup()関数.
WSADataと入力します
wVersion As Integer
wHighVersion As Integer
szDescription As String* WSA_DescriptionSize
szSystemStatus As String* WSA_SysStatusSize
整数としてのiMaxSockets
iMaxUdpDg As Integer
lpVendorInfo As String* 200
終了タイプ
'ソケットのリターンコードを定義する
Public Const INVALID_SOCKET=&HFFFF
Public Const SOCKET_ERROR=-1
'ソケットタイプを定義する
Public Const SOCK_STREAM= 1'ストリームソケット
Public Const SOCK_DGRAM= 2'データグラムソケット
Public Const SOCK_RAW= 3'生のデータソケット
Public Const SOCK_RDM= 4'信頼性の高い配信ソケット
Public Const SOCK_SEQPACKET= 5'シーケンスパケットソケット
'住所ファミリを定義する
Public Const AF_UNSPEC= 0'詳細不明
Public Const AF_UNIX= 1'ローカルからホスト(パイプ、ポータル)
Public Const AF_INET= 2'インターネットワーク:UDP、TCPなど
Public Const AF_IMPLINK= 3'arpanetimpアドレス
Public Const AF_PUP= 4'pupプロトコル:例: BSP
Public Const AF_CHAOS= 5'CHAOSプロトコルをミット
Public Const AF_NS= 6'XEROXNSプロトコル
Public Const AF_ISO= 7'ISOプロトコル
Public Const AF_OSI= AF_ISO'OSIはISOです
Public Const AF_ECMA= 8'ヨーロッパのコンピューターメーカー
Public Const AF_DATAKIT= 9'データキットプロトコル
Public Const AF_CCITT= 10'CCITTプロトコル、X.25など
Public Const AF_SNA= 11'IBM SNA
Public Const AF_DECnet= 12'DECnet
Public Const AF_DLI= 13'直接データリンクインターフェース
Public Const AF_LAT= 14'LAT
Public Const AF_HYLINK= 15'NSCハイパーチャネル
Public Const AF_APPLETALK= 16'AppleTalk
Public Const AF_NETBIOS= 17'NetBiosスタイルのアドレス
Public Const AF_MAX= 18'住所ファミリの最大数
'インターネットアドレスを格納するためのsockaddrデータ型の設定
sockaddrと入力します
sa_family As Integer
sa_data As String* 14
終了タイプ
Public Const SADDRLEN= 16
'ソケット関数を宣言する
パブリック宣言PtrSafe関数closesocketLib "wsock32.dll"(ByVal s As Long)As Long
パブリック宣言PtrSafe関数connectLib "wsock32.dll"(ByVal s As Long、addr As sockaddr_in、ByVal namelen As Long)As Long
パブリック宣言PtrSafe関数htonsLib "wsock32.dll"(ByVal hostshort As Long)As Integer
パブリック宣言PtrSafe関数inet_addrLib "wsock32.dll"(ByVal cp As String)As Long
パブリック宣言PtrSafe関数recvLib "wsock32.dll"(ByVal s As Long、buf As Any、ByVal buflen As Long、ByVal flags As Long)As Long
パブリック宣言PtrSafe関数recvBLib "wsock32.dll"エイリアス "recv"(ByVal s As Long、buf As Any、ByVal buflen As Long、ByVal flags As Long)As Long
Public Declare PtrSafe Function send Lib "wsock32.dll"(ByVal s As Long、buf As Any、ByVal buflen As Long、ByVal flags As Long)As Long
パブリック宣言PtrSafe関数ソケットLib "wsock32.dll"(ByVal af As Long、ByVal socktype As Long、ByVal protocol As Long)As Long
パブリック宣言PtrSafe関数WSAStartupLib "wsock32.dll"(ByVal wVersionRequired As Long、lpWSAdata As WSAData)As Long
PtrSafe関数をパブリック宣言WSACleanupLib "wsock32.dll"()As Long
PtrSafe関数をパブリック宣言WSAUnhookBlockingHookLib "wsock32.dll"()As Long
パブリック宣言PtrSafeSub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"(hpvDest As Any、hpvSource As Any、ByVal cbCopy As Long)
パブリック宣言PtrSafe関数setsockoptLib "wsock32.dll"(ByVal s As Long、ByVal level As Long、ByVal optname As Long、optval As Long、ByVal optlen As Long)As Long
グローバル定数SO_RCVTIMEO=&H1006
グローバル定数SOL_SOCKET=&HFFFF&
返信リスト(回答:7)
取り組むべき特定の問題がある場合、トラブルシューティングは非常に簡単になる可能性があります.たとえば、「...まだ何も機能していないことを試しました...」
何を試しましたか? 「何も機能していない」とはどういう意味ですか? コードはエラーを発生させますか?間違った結果が出ますか?結果がありません?何もありませんか?
これはかなり拡張されたコードブロックであり、他の誰かにあなたのコンピュータで何が起こっているのかを読んで診断するように頼むのは少し難しいかもしれません.
上記の特定のもの以外に、潜在的に役立つ可能性のあるものには、このコンピューター上のWindowsのversion、Accessのversion、AccessApplicationのビット数などがあります.
そのコードがどこから来たのかを知ることも役立つかもしれません.どこで見つけましたか?
誰かがあなたを助けるかもしれない詳細を追加してくれてありがとう.また、実際に何を試し、どのように失敗したかについての明確な説明もあります.
応答7# ->にスキップ6 #Christoどうもありがとうございました!
死んだように継ぎ目の上でコードを実行しようとすると:
(1)起動wnisockではなく、ゼロはありません
(2) Winsockを初期化するか、開いたり接続したりすることを示す兆候はありません.
(3)IP/ポートに送信するために準備されたデータは100%OKです.以下を参照してください.
0000= 1A 5D 02 00 00 03 D6 7B 0D 0A 20 20 20 22 50 6F|..]..........{.... 「Po
0010= 73 56 65 6E 64 6F 72 22 3A 20 22 4E 65 63 74 6F|sVendor ":" Necto
0020= 72 20 50 72 69 6D 65 20 41 63 63 6F 75 6E 74 69|rプライムアカウント
0030= 6E 67 20 53 6F 6C 75 74 69 6F 6E 73 22 2C 0D 0A|ng Solutions "、....
0040= 20 20 20 22 50 6F 73 53 6F 66 74 56 65 72 73 69 | 「PosSoftVersi
0050= 6F 6E 22 3A 20 22 32 2E 30 2E 30 2E 31 22 2C 0D|on ":" 2.0.0.1 "、..
0060= 0A 20 20 20 22 50 6F 73 4D 6F 64 65 6C 22 3A 20|.. 「PosModel」:
0070= 22 43 61 70 2D 32 30 31 37 22 2C 0D 0A 20 20 20|「Cap-2017」、....
0080= 22 50 6F 73 53 65 72 69 61 6C 4E 75 6D 62 65 72|"PosSerialNumber
0090= 22 3A 20 22 31 30 30 31 30 30 30 30 31 38 32 39|":" 100100001829
00A0= 22 2C 0D 0A 20 20 20 22 49 73 73 75 65 54 69 6D|"、..... 「IssueTim
00B0= 65 22 3A 20 22 32 30 32 31 30 37 32 38 31 39 35|e ":" 20210728195
00C0= 33 34 30 22 2C 0D 0A 20 20 20 22 54 72 61 6E 73|340 "、.... 「トランス
00D0= 61 63 74 69 6F 6E 54 79 70 65 22 3A 20 30 2C 0D|actionType ":0、..
00E0= 0A 20 20 20 22 50 61 79 6D 65 6E 74 4D 6F 64 65|.. 「PaymentMode
00F0= 22 3A 20 30 2C 0D 0A 20 20 20 22 53 61 6C 65 54|":0、.... 「SaleT
0100= 79 70 65 22 3A 20 30 2C 0D 0A 20 20 20 22 4C 6F|ype ":0、.... 「Lo
0110= 63 61 6C 50 75 72 63 68 61 73 65 4F 72 64 65 72|calPurchaseOrder
0120= 22 3A 20 6E 75 6C 6C 2C 0D 0A 20 20 20 22 43 61|": ヌル、.... 「Ca
0130= 73 68 69 65 72 22 3A 20 22 41 64 6D 69 6E 20 4D|shier ":"管理者M
0140= 61 6E 61 67 65 72 22 2C 0D 0A 20 20 20 22 42 75|anager」、... 「Bu
0150= 79 65 72 54 50 49 4E 22 3A 20 22 31 30 32 32 35|yerTPIN ":" 10225
0160= 33 30 30 33 54 22 2C 0D 0A 20 20 20 22 42 75 79|3003T "、... 「購入
0170= 65 72 4E 61 6D 65 22 3A 20 22 4E 64 6F 6C 61 20|erName ":" Ndola
0180= 50 6C 61 6E 6E 69 6E 67 20 47 72 6F 75 70 22 2C |計画グループ」、
0190= 0D 0A 20 20 20 22 42 75 79 65 72 54 61 78 41 63|.... 「BuyerTaxAc
01A0= 63 6F 75 6E 74 4E 61 6D 65 22 3A 20 22 4E 64 6F|countName ":" Ndo
01B0= 6C 61 20 50 6C 61 6E 6E 69 6E 67 20 47 72 6F 75 |ラプランニンググループ
01C0= 70 22 2C 0D 0A 20 20 20 22 42 75 79 65 72 41 64|p "、.... 「BuyerAd
01D0= 64 72 65 73 73 22 3A 20 22 42 6F 78 22 2C 0D 0A |ドレス」:「ボックス」、....
01E0= 20 20 20 22 42 75 79 65 72 54 65 6C 22 3A 20 6E | 「BuyerTel」:n
01F0= 75 6C 6C 2C 0D 0A 20 20 20 22 4F 72 69 67 69 6E |ええと、.... 「オリジン
0200= 61 6C 49 6E 76 6F 69 63 65 43 6F 64 65 22 3A 20|alInvoiceCode ":
0210= 6E 75 6C 6C 2C 0D 0A 20 20 20 22 4F 72 69 67 69 |ヌル、.... 「オリジ
0220= 6E 61 6C 49 6E 76 6F 69 63 65 4E 75 6D 62 65 72|nalInvoiceNumber
0230= 22 3A 20 6E 75 6C 6C 2C 0D 0A 20 20 20 22 4D 65|": ヌル、.... 「私
0240= 6D 6F 22 3A 20 6E 75 6C 6C 2C 0D 0A 20 20 20 22|mo ":null、.... "
0250= 43 75 72 72 65 6E 63 79 2D 54 79 70 65 22 3A 20 |通貨タイプ」:
0260= 22 5A 4D 57 22 2C 0D 0A 20 20 20 22 43 6F 6E 76|「ZMW」、... 「コンversion
0270= 65 72 73 69 6F 6E 2D 52 61 74 65 22 3A 20 31 2C|ersion-Rate ":1、
0280= 0D 0A 20 20 20 22 49 74 65 6D 73 22 3A 20 5B 0D|.... 「アイテム」:[..
0290= 0A 20 20 20 20 20 20 7B 0D 0A 20 20 20 20 20 20|.. {....
02A0= 20 20 20 22 49 74 65 6D 49 64 22 3A 20 31 2C 0D | "ItemId":1、..
02B0= 0A 20 20 20 20 20 20 20 20 20 22 44 65 73 63 72|.. 「説明
02C0= 69 70 74 69 6F 6E 22 3A 20 22 46 72 75 69 74 20|iption ":"フルーツ
02D0= 4A 75 69 63 65 22 2C 0D 0A 20 20 20 20 20 20 20 |ジュース」、....
02E0= 20 20 22 42 61 72 43 6F 64 65 22 3A 20 22 32 30 | "バーコード": "20
02F0=30 30 22 2C 0D 0A 20 20 20 20 20 20 20 20 20 22|00 "、...."
0300= 51 75 61 6E 74 69 74 79 22 3A 20 33 2C 0D 0A 20 |数量」:3、....
0310= 20 20 20 20 20 20 20 20 22 55 6E 69 74 50 72 69 | 「UnitPri
0320= 63 65 22 3A 20 38 36 2C 0D 0A 20 20 20 20 20 20|ce ":86、....
0330= 20 20 20 22 44 69 73 63 6F 75 6E 74 22 3A 20 30 | 「割引」:0
0340= 2C 0D 0A 20 20 20 20 20 20 20 20 20 22 54 61 78|、..... 「税金
0350= 4C 61 62 65 6C 73 22 3A 20 5B 0D 0A 20 20 20 20 |ラベル」:[....
0360= 20 20 20 20 20 20 20 20 22 41 22 0D 0A 20 20 20 | 「A」....
0370= 20 20 20 20 20 20 5D 2C 0D 0A 20 20 20 20 20 20 | ]、 ....
0380= 20 20 20 22 54 6F 74 61 6C 41 6D 6F 75 6E 74 22 | 「合計金額」
0390= 3A 20 32 35 38 2C 0D 0A 20 20 20 20 20 20 20 20|:258、....
03A0= 20 22 49 73 54 61 78 49 6E 63 6C 75 73 69 76 65 | 「IsTaxInclusive
03B0= 22 3A 20 74 72 75 65 2C 0D 0A 20 20 20 20 20 20|":true、....
03C0= 20 20 20 22 52 52 50 22 3A 20 30 0D 0A 20 20 20 | 「RRP」:0....
03D0= 20 20 20 7D 0D 0A 20 20 20 5D 0D 0A 7D 5E 33 | } .... ]....} ^ 3
応答6# ->にスキップ4 #GroverPエラーメッセージはありませんか?何も起こりませんか?
ここで16進ダンプが役立つかどうかはわかりません.私たちはVBAプロセスについて話している.VBAに焦点を当てる必要があります...
1)どこでコードを入手しましたか?明らかにどこかからコピーされています.
2)VBAのトラブルシューティングは遠くから行うのは簡単ではありません.お使いのパソコンで何が起こっているのかわからないため、ご提供できる情報のみに対応いたします.
以前に聞いておくべきだったのですが、このコードは実際にAccess accdbでコンパイルされますか?
応答4# ->にスキップ5 #Christoはい、エラーなしでコンパイルします.
以下はマニュアルへのリンクです
GOOGLE検索:
上記のマニュアルが、誤解した場合に備えて役立つことを願っています.
よろしく
応答5# ->にスキップ2 #GroverPそれで、それはあなたが使ういくつかのハードウェアのためのユーザーマニュアルの一部ですか?ありがとう.それは
通常です 有用な洞察.あなたはそのマニュアルから直接これらをコピーしたと思いますか?私の最初の考えは、サポートのためにそのハードウェアのベンダーに行くべきだということです.彼らはマニュアルを書き、VBAが何をすべきかを正確に知っていると思います.たとえば、彼らは議論の中でExcelを使用していることに注意してください.代わりにAccessを使用しているように見えるので、おそらくそれが要因です.
誰かがそのコードを掘り下げて、それを機能させる方法を見つけようとする時間があると思いますが、すぐには起こらない可能性があるので、それまでの間、自分でさらにいくつかのトラブルシューティング手順を試してください.
各プロシージャ(サブと関数)の上部にブレークポイントを配置し、一度に1行ずつコードをステップ実行します.処理される各変数の値を確認してください.式にウォッチを追加することでもこれを行うことができます.
あなたが探しているのは、コードが実際にあなたが期待することをしているということです.
応答3# ->にスキップ1 #Christo上記のコードを使用する方法は次のとおりです.以下を参照してください.
Winsockの起動
initWinsockを呼び出す
Winsockを開く
OpenSocket( "192.168.1.197"、8888)に電話してください
データの送信
薄暗いlngStatus限り
lngStatus= Sendcommand(strData)
スリープ機能
Dim ival As Long、sv As Long
ival= 1000 'ミリ秒単位の時間
sv= LenB(ival)
x= setsockopt(socketId、SOL_SOCKET、SO_RCVTIMEO、ival、LenB(sv))
ポートから読み取る
'TCP/IPポートから最大バイト数を読み取ります.20=長さであることに注意してください
lngStatus= RecvAscii(strData、60)
締めくくり
CloseConnectionを呼び出す
EndItを呼び出す
最後に、データの送信時にエラーが発生します