2009-07-24 14 views
2

Microsoft Access内にVisual Basicアプリケーションがあり、ネットワーク接続を確立する必要があります。 VB6では、これを可能にしたWinSockという便利な小さなコントロールがありましたが、Microsoft Accessの内部に存在するVB版の削除されたものと類似のものは見つかりませんでした。何か案は?Microsoft AccessからVisual Basicとネットワーク接続するにはどうすればよいですか?

私は何の答えも得ていないので、私はこれが必要なものを明確にしようとします。

私のアプリケーションは電子メールを送信しています。現在、Outlookの組み込みオブジェクトを使用してメッセージを作成し、バックグラウンドで送信しています。欠点は、電子メールを送信するための「外部プログラム」の承認をユーザに促すことであり、ユーザを苛立たせ、不要と思われる。私がオンラインで見つけることができた他の電子メールオプションのすべては、コントロールをダウンロードまたは購入する必要があります。これは、私たちがすべてのユーザーに展開するにはあまりにも労力を要します。

ソケットコントロールを使用してSMTPサーバーに手動で接続してメッセージを送信することを望んでいましたが(これは他の言語では簡単なので)、VBAでTCP接続を確立する方法が見つかりません。

答えて

1

私は先月号でこの問題を扱ったばかりです。いろいろな理由で、CDOは適切ではなく、MAPI方法を直接使用するのは難しく、Outlookのプロンプトでは完全に容認できないと不平を言う。

私はOutlook Redemptionを使用しました。 Access開発者が広く使用していますが、私はそれがむしろ複雑であり、ひどくうまく文書化されていないことがわかりました。しかし、それは非常にうまくやっています。

0

Microsoftによって追加された電子メールの「セキュリティ」機能は、多くの開発者を不満に思っています。私は優雅な解決策を知らない。私はフリーウェアのClickYes Expressを使って成功しましたが、もちろんそれはあなたが求める答えではありません。

+0

ええ、私たちはオプションを持たなくなってしまうかもしれませんが、その種の解決策を検討する必要があります。どこにでもTCP接続を作成するための簡単な答えは見つけられません。 VB6では、私はちょうどwinsockコントロールを投げて、オフにして実行することができます。 SMTPは私のコードを書き換えて自分のメールサーバーに手動で接続するのは簡単なプロトコルです。 ここでは簡単な解決策を見つけることができません。 –

+0

私はVBの後にVBAを使用して行くかもしれないすべての不満を想像することはできません!あなたがカヌーを使ってカヌーをしようとしているようです。カヌーで完全な「エスキモー・ロール」をすることが本当に不可能な場合は、カヌーで経験したことのある人にお願いします。 "はい、そうです。"しかし、カヌーとVBAには神様に感謝します。 – Smandoli

+0

あなたが正しいダイアログを理解しているかどうかわからないので、ひどい解決策です。 –

0

OPに記載されている特定の問題については、より良い解決策があります。 Outlookにメールを保存します。それを「送信」しないでください。これは、送信される内容、いつ、ポップアップダイアログを生成しないかを明示的に制御します。トリプル勝利。

しかし、あなたは

Option Explicit 

Public Const AF_INET = 2 'internetwork: UDP, TCP, etc. 
Public Const SOCK_STREAM = 1 'Stream socket 
Public Const SOCKET_ERROR = -1 

Type sockaddr_in 
    sin_family As Integer 
    sin_port As Integer 
    sin_addr As Long 
    sin_zero As String * 8 
End Type 

#If Win32 Then 

'for WSAStartup() function. 
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 

Type wsaData 
    wVersion As Integer 
    wHighVersion As Integer 
    szDescription As String * WSA_DescriptionSize 
    szSystemStatus As String * WSA_SysStatusSize 
    iMaxSockets As Integer 
    iMaxUdpDg As Integer 
    lpVendorInfo As String * 200 
End Type 

#If Not VBA7 Then 
'Use this section for Excel 95 
Type Hostent 
    h_name As Long   '32 bit pointer 
    h_aliases As Long  '32 bit pointer 
    h_addrtype As Integer 'String * 2 (declared as short) 
    h_length As Integer  'String * 2 (declared as short) 
    h_addr_list As Long  '32 bit pointer 
End Type 

Public Declare Function closesocket Lib "ws2_32.dll" (ByVal s As Long) As Long 
Public Declare Function connect Lib "ws2_32.dll" (ByVal sID As Long, ByRef name As sockaddr_in, ByVal namelen As Long) As Long 
Public Declare Function htons Lib "ws2_32.dll" (ByVal hostshort As Integer) As Integer 
Public Declare Function inet_addr Lib "ws2_32.dll" (ByVal cp As String) As Long 
Public Declare Function recv Lib "ws2_32.dll" (ByVal s As Long, ByRef buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long 
Public Declare Function recvstr Lib "ws2_32.dll" (ByVal s As Long, ByVal buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long 
Public Declare Function send Lib "ws2_32.dll" (ByVal s As Long, ByRef buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long 
Public Declare Function socket Lib "ws2_32.dll" (ByVal af As Long, ByVal s_type As Long, ByVal Protocol As Long) As Long 
Public Declare Function WSAStartup Lib "ws2_32.dll" (wVersionRequested As Integer, lpWSAData As wsaData) As Long 
Public Declare Function WSACleanup Lib "ws2_32.dll"() As Long 

'Public Declare Function setsockopt Lib "ws2_32.dll" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, ByVal optlen As Long) As Long 
Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long) 
Public Declare Function gethostbyname Lib "ws2_32.dll" (ByVal host_name As String) As Long 

#Else 
'on Win64, ws2_32.dll in system32 has the file description "32-bit DLL" and uses 64bit pointers (morons) 
'on Win64 as on Win32, 32-bit numbers are called int. 
'on VBA7/64, as on VBA6/32, 32 bit numbers are called long. 
'delete following duplicate section for Excel 95 

Type Hostent 
    h_name As LongPtr  '32/64 bit pointer 
    h_aliases As LongPtr '32/64 bit pointer 
    h_addrtype As Integer 'String * 2 (declared as short) 
    h_length As Integer  'String * 2 (declared as short) 
    h_addr_list As LongPtr '32/64 bit pointer 
End Type 


Public Declare PtrSafe Function closesocket Lib "ws2_32.dll" (ByVal sID As LongPtr) As Long 
Public Declare PtrSafe Function connect Lib "ws2_32.dll" (ByVal sID As LongPtr, ByRef name As sockaddr_in, ByVal namelen As Long) As Long 
Public Declare PtrSafe Function htons Lib "ws2_32.dll" (ByVal hostshort As Integer) As Integer 
Public Declare PtrSafe Function inet_addr Lib "ws2_32.dll" (ByVal cp As String) As Long 
Public Declare PtrSafe Function recv Lib "ws2_32.dll" (ByVal sID As LongPtr, ByRef buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long 
Public Declare PtrSafe Function recvstr Lib "ws2_32.dll" (ByVal sID As LongPtr, ByVal buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long 
Public Declare PtrSafe Function send Lib "ws2_32.dll" (ByVal sID As LongPtr, ByRef buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long 
Public Declare PtrSafe Function socket Lib "ws2_32.dll" (ByVal af As Long, ByVal s_type As Long, ByVal Protocol As Long) As Long 
Public Declare PtrSafe Function WSAStartup Lib "ws2_32.dll" (wVersionRequested As Integer, lpWSAData As wsaData) As Long 
Public Declare PtrSafe Function WSACleanup Lib "ws2_32.dll"() As Long 

'Public Declare PtrSafe Function setsockopt Lib "ws2_32.dll" (ByVal sID As Long, ByVal level As LongPtr, ByVal optname As Long, optval As Any, ByVal optlen As Long) As Long 
Public Declare PtrSafe Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As LongPtr) 
Public Declare PtrSafe Function gethostbyname Lib "ws2_32.dll" (ByVal host_name As String) As LongPtr 


#End If 
#Else 
'OSX 
'delete following duplicate section for Excel 95 
'No 64bit version of Excel is available yet for the OSX 
Type Hostent 
    h_name As Long  '32 bit pointer 
    h_aliases As Long '32 bit pointer 
    h_addrtype As Long '32 bit int (declared as int) 
    h_length As Long '32 bit int (declared as int) 
    h_addr_list As Long '32 bit pointer 
End Type 

'ssize_t is a signed type. signed version of size_t, 
'used where a size may instead contain a negative error code 
'size_t is the unsigned integer type of the result of the sizeof operator 
'size_t is an unsigned integer type of at least 16 bit 

'or libsystem.dylib ? 
Public Declare Function socket Lib "libc.dylib" (ByVal af As Long, ByVal s_type As Long, ByVal Protocol As Long) As Long 
Public Declare Function connect Lib "libc.dylib" (ByVal s As Long, ByRef name As sockaddr_in, ByVal namelen As Long) As Long 
' or read ? 
Public Declare Function recv Lib "libc.dylib" (ByVal s As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long 
Public Declare Function send Lib "libc.dylib" (ByVal s As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long 
Public Declare Function htons Lib "libc.dylib" (ByVal Host_Short As Integer) As Integer 'x x x, but seems to work !!! 
Public Declare Function inet_addr Lib "libc.dylib" (ByVal cp As String) As Long 
Public Declare Function closesocket Lib "libc.dylib" Alias "close" (ByVal s As Long) As Long 
Public Declare Function setsockopt Lib "libc.dylib" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, ByVal optlen As Long) As Long 
Public Declare Function gethostbyname Lib "libc.dylib" (ByVal host_name As String) As Long 
Public Declare Sub CopyMemory Lib "libc.dylib" Alias "memmove" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long) 

#End If 

Private Function MyData(I_SocketAddress As sockaddr_in, Register As Integer, dataword As Long, serr As String) As Long 
Dim strSend  As String 
Dim count  As Integer 
Dim bArray() As Byte 
Dim errCode  As Integer 
Dim socketID As Long 

socketID = socket(AF_INET, SOCK_STREAM, 0) 
errCode = connect(socketID, I_SocketAddress, Len(I_SocketAddress)) 

count = send(socketID, ByVal strSend, Len(strSend), 0) 

If count <> Len(strSend) Then 
    errCode = -1 
    serr = "ERROR: network failure on send, " & Err.LastDllError() 
Else 
    count = RecvB(socketID, bArray, maxLength) 

    dodata bArray 
End If 
    DoEvents 
    Call closesocket(socketID) 
    MyData = errCode 
End Function 

Private Function RecvB(socketID As Long, bArray() As Byte, ByVal maxLength As Integer) As Integer 
Dim c As String * 1 
Dim b   As Byte 
Dim buf()  As Byte 
Dim Length  As Integer 
Dim count  As Long 
Dim i   As Integer 
Dim dStartTime As Variant 
Dim nErr  As Long 

Const iFlags = 0 

ReDim bArray(1 To maxLength) 
ReDim buf(1 To maxLength) 

dStartTime = Time 
While (Length < maxLength) And (4 > DateDiff("s", dStartTime, Time)) 
    DoEvents 
    count = recv(socketID, buf(1), maxLength, iFlags) 

    If count = SOCKET_ERROR Then '-1 
     nErr = Err.LastDllError() 
     If nErr = 0 Then 
      RecvB = -1 
     Else 
      RecvB = -nErr 
     End If 
     'Debug.Print "socket_error in RecvB. lastdllerror:", nErr 
     Exit Function ' 
    End If ' 
    For i = 1 To count 
     bArray(Length + i) = buf(i) 
    Next 
    Length = Length + count 
Wend 
RecvB = Length 

End Function 

....頼むので、これはTCPコードではなく、電子メールのコードです。また、これまでに公開していないOSX VBA TCPコードも含まれています。

関連する問題