他の掲示板で投稿
(http://www.takeittechies.com/vbtomo/boards/vbqanda.php?do=leaf&num=4828)
していたのですが最終投稿から1週間が過ぎてしまい、いまだ解決していませんの
でこちらでも投稿させていただきます。
対処法が分かる方がおりましたら回答をお願いいたします。
問題点:
ActiveX DLLで非表示のフォームにWinsockコントロールを貼り付けて制御をしてい
るプログラムがあるのですが、Connect時に「Sockエラー10022:ソケットが連結さ
れていないか、アドレスが不正か、またはAccept メソッドの前に Listen メソッ
ドが呼び出されていません。」が発生する時があります。
エラーが発生する条件としてIDE上で連続2回以上(1回目はOKだけど一度終了
して再度)デバックしようとした時に発生しています。IDEを立ち上げ直せば再
度デバックできるようになるのですが、立ち上げなおさなくてもデバックできる
ようになる方法は無いでしょうか。
環境はWin2000+SP4, VB6+SP5を使用してます。
他掲示板でのやりとり:
> Microsoft の KnowledgeBase で "10022" を検索すると、いくつかの記事が見つ
> かります。この中に思い当たる原因はないでしょうか?
> http://support.microsoft.com/default.aspx?scid=fh;JA;KBHOWTO
>
KnowledgeBase の検索ですが17件ヒットしましたがいずれも違っていました。
「Sockエラー10022」の解釈である
「アドレスの不正」はIDE起動後の初回デバッグはできるので大丈夫だと思います。
「Accept〜」はクライアント側なので関係なさそうです。
「ソケットの連結」はどのような状態を示しているのか分かりませんが、IDE起
動後の初回デバッグはできるので大丈夫だと思います。
googleでも「10022 Connect ソケット」などと検索したのですが、今のところお手
上げ状態です。
> ひとつ思うのは、「二回目がエラー」ということは、「一回目が正しく終わっていない」、
> という事なんじゃないかと。
>
> Close メソッドは発行していますが、それが完了する前にプログラムが終了してしまって
> いるのではないでしょうか? Close イベントを待機してみたらどうでしょう?
> #Close イベントが起こっているか確認するだけでも良い。
>
winsockコントロールはCloseメソッドを使用してもCloseイベントは発生しない仕様になっているよ
うです。Closeイベントは相手側にCloseされた時に発生するみたいです。
なのでStateプロパティで(Closeメソッドの直下で)確認したところsckClosedになっていましたので
閉じてはいるみたいです。
「二回目がエラー」というのはデバッグの回数(F5の押下数)なので、例えばフォームをUnloadせずに
Commandボタンの1(Connect)->2(Close)->1(Connect)->2(Close)と押下しても正しく動作します。
IDEがActiveXDLLをメモリに残そうとして変な風に悪さしているのかな。
#回答ではないです
まずは、その現象が再現できる最小限のプロジェクトの作成手順等を
教えていただければ、いろいろ検証できると思いますが。
私もユーザーコントロールのフォームにWinsockを貼り付けて
ActiveXコントロールを作った事がありますが、そのような現象が出た
ことがありませんので。
ABC様レスありがとうございます。
現象が再現できるコードと操作方法(一番下)を掲載させていただきます。
'---- ActiveX DLL側(class1.cls) ここから ----
'フォームを用意してWinsockコントロールを貼り付ける必要あり。
Private Sub Class_Initialize()
Load form1
End Sub
Private Sub Class_Terminate()
form1.winsock1.Close
Unload form1
End Sub
Public Sub SockOpen()
On Error Resume Next
With form1.winsock1
.Close
.Protocol = sckTCPProtocol
.RemoteHost = "xxx.xxx.xxx.xxx" 'アドレスは任意
.RemotePort = 10000 'ポート番号は任意
.LocalPort = 0
.Connect
If Err.Number <> 0 then
msgbox "SockOpen:" & Err.Number & " " & Err.Description
'Debug.Print "SockOpen:" & Err.Number & " " & Err.Description
End If
End With
End Sub
'---- ActiveX DLL側(class1.cls) ここまで ----
'---- EXE側(.frm) ここから ----
'IDEのプロジェクト->参照設定で作成したActiveX DLLを参照する必要あり
Private objTest As class1
Private Sub Command1_Click()
Set objTest = New clsTest
objTest.SockOpen
End Sub
Private Sub Command2_Click()
Set objTest = Nothing
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Set objTest = Nothing
End Sub
'---- EXE側(.frm) ここまで ----
再現方法ですが、
1) EXE側でF5を押下してデバッグ。(ActiveX側はIDEで表示している必要は無いです。)
2) Command1押下。
3) Command2押下。
4) Formを閉じてデバッグを一度終了。
5) 1), 2)を再度繰り返すとエラーが発生します。
一度EXE側のIDEを終了して再度立ち上げれば一度だけデバッグできるようになります。
ご提示いただいたソースを実行させて見たのですが
F5→Command1クリック→Command2クリック→終了
再び
F5→Command1クリック→Command2クリック→終了
としてみましたが、何事も無く終了しました。
環境がちがうのでなんともいえませんが
環境はWinXP Pro SP2, VB6.0 Sp6です
OSまたはサービスパックの問題でしょうか?
ABC様レスありがとうございます。
私の方でもXPPro+SP1, VB6+SP5で実験した結果、無事に動作していました。
サービスパックの問題ではないようです。
OSかIEの問題でしょうか?
Win2000ではIE5.5+SPを使用しており、XPはIE6.0+SP1を使用しています。
すぐには無理ですが、IE6にVer.UPできる状況になりましたら再度実験して
みたいと思います。(多分11月後半か12月頃かと...)
抜けてましたので補足:
Win2000ではIE5.5+SP2
たびたび申し訳ありません。
とりあえずXPでは問題なく動作していますので解決とさせていただきます。
ツイート | ![]() |