システムwiki

ms access vbaWinsockコードを機能させる方法

Christo 受付中 最終更新日:2022-01-23 11:45

以下の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)

7 #
GroverP

取り組むべき特定の問題がある場合、トラブルシューティングは非常に簡単になる可能性があります.たとえば、「...まだ何も機能していないことを試しました...」

何を試しましたか? 「何も機能していない」とはどういう意味ですか? コードはエラーを発生させますか?間違った結果が出ますか?結果がありません?何もありませんか?

これはかなり拡張されたコードブロックであり、他の誰かにあなたのコンピュータで何が起こっているのかを読んで診断するように頼むのは少し難しいかもしれません.

上記の特定のもの以外に、潜在的に役立つ可能性のあるものには、このコンピューター上の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行ずつコードをステップ実行します.処理される各変数の値を確認してください.式にウォッチを追加することでもこれを行うことができます.

あなたが探しているのは、コードが実際にあなたが期待することをしているということです.

応答2# ->にスキップ
3 #
GroverP

ちなみに、手続きにはIPとポート番号を渡す必要があります.ご使用の環境で有効なパラメーターを使用していますか?

応答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を呼び出す

最後に、データの送信時にエラーが発生します