[Ttssh2-commit] [6076] USBシリアルに接続中にUSBシリアルケーブルを抜き差しするとCOMに接続できなくなる不具合修正

アーカイブの一覧に戻る

svnno****@sourc***** svnno****@sourc*****
2015年 11月 5日 (木) 20:44:40 JST


Revision: 6076
          http://sourceforge.jp/projects/ttssh2/scm/svn/commits/6076
Author:   salarm
Date:     2015-11-05 20:44:40 +0900 (Thu, 05 Nov 2015)
Log Message:
-----------
USBシリアルに接続中にUSBシリアルケーブルを抜き差しするとCOMに接続できなくなる不具合修正
・COMポートが消えた時に自動的に切断してCOMポートが復活した時に再接続するようにした
※WindowsXP以降でのみ動作

Modified Paths:
--------------
    trunk/teraterm/common/ttcommon.h
    trunk/teraterm/teraterm/vtwin.cpp
    trunk/teraterm/teraterm/vtwin.h
    trunk/teraterm/ttpcmn/ttcmn.c
    trunk/teraterm/ttpcmn/ttpcmn.def

-------------- next part --------------
Modified: trunk/teraterm/common/ttcommon.h
===================================================================
--- trunk/teraterm/common/ttcommon.h	2015-11-05 11:25:37 UTC (rev 6075)
+++ trunk/teraterm/common/ttcommon.h	2015-11-05 11:44:40 UTC (rev 6076)
@@ -10,6 +10,7 @@
 #endif
 
 int PASCAL DetectComPorts(LPWORD ComPortTable, int ComPortMax, char **ComPortDesc);
+int PASCAL CheckComPort(WORD ComPort);
 void PASCAL CopyShmemToTTSet(PTTSet ts);
 void PASCAL CopyTTSetToShmem(PTTSet ts);
 BOOL FAR PASCAL StartTeraTerm(PTTSet ts);

Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp	2015-11-05 11:25:37 UTC (rev 6075)
+++ trunk/teraterm/teraterm/vtwin.cpp	2015-11-05 11:44:40 UTC (rev 6076)
@@ -49,6 +49,7 @@
 
 #include <windowsx.h>
 #include <imm.h>
+#include <Dbt.h>
 
 #include "tt_res.h"
 #include "vtwin.h"
@@ -80,6 +81,8 @@
 
 static BOOL IgnoreRelease = FALSE;
 
+static int AutoDisconnectedPort = -1;
+
 // \x96{\x91̂\xCD addsetting.cpp
 extern mouse_cursor_t MouseCursor[];
 
@@ -123,6 +126,7 @@
 	ON_WM_SYSKEYUP()
 	ON_WM_TIMER()
 	ON_WM_VSCROLL()
+	ON_WM_DEVICECHANGE()
 	ON_MESSAGE(WM_IME_COMPOSITION,OnIMEComposition)
 	ON_MESSAGE(WM_INPUTLANGCHANGE,OnIMEInputChange)
 	ON_MESSAGE(WM_IME_NOTIFY,OnIMENotify)
@@ -2974,6 +2978,33 @@
 	DispVScroll(Func,nPos);
 }
 
+BOOL CVTWindow::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
+{
+	if (nEventType == DBT_DEVICEARRIVAL || nEventType ==DBT_DEVICEREMOVECOMPLETE) {
+		if (ts.PortType == IdSerial) {
+			if (cv.Open != 0) {
+				/* \x90ڑ\xB1\x92\x86 */
+				if (CheckComPort(cv.ComPort) == 0) {
+					AutoDisconnectedPort = cv.ComPort;
+					Disconnect(TRUE);
+					return 0;
+				}
+			}
+			else {
+				/* \x96\xA2\x90ڑ\xB1 */
+				if (AutoDisconnectedPort == cv.ComPort && CheckComPort(cv.ComPort) == 1) {
+					AutoDisconnectedPort = -1;
+					Connecting = TRUE;
+					ChangeTitle();
+					CommOpen(HVTWin, &ts, &cv);
+					return 0;
+				}
+			}
+		}
+	}
+	return CFrameWnd::OnDeviceChange(nEventType, dwData);
+}
+
 //<!--by AKASI
 LONG CVTWindow::OnWindowPosChanging(UINT wParam, LONG lParam)
 {
@@ -3408,6 +3439,8 @@
 
 LONG CVTWindow::OnCommOpen(UINT wParam, LONG lParam)
 {
+	AutoDisconnectedPort = -1;
+
 	CommStart(&cv,lParam,&ts);
 #ifndef NO_INET6
 	if (ts.PortType == IdTCPIP && cv.RetryWithOtherProtocol == TRUE) {

Modified: trunk/teraterm/teraterm/vtwin.h
===================================================================
--- trunk/teraterm/teraterm/vtwin.h	2015-11-05 11:25:37 UTC (rev 6075)
+++ trunk/teraterm/teraterm/vtwin.h	2015-11-05 11:44:40 UTC (rev 6076)
@@ -91,6 +91,7 @@
 	afx_msg void OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
 	afx_msg void OnTimer(UINT nIDEvent);
 	afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
+	afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD_PTR dwData);
 //<!--by AKASI
 	afx_msg LONG OnWindowPosChanging(UINT wParam, LONG lParam);
 	afx_msg LONG OnSettingChange(UINT wParam, LONG lParam);

Modified: trunk/teraterm/ttpcmn/ttcmn.c
===================================================================
--- trunk/teraterm/ttpcmn/ttcmn.c	2015-11-05 11:25:37 UTC (rev 6075)
+++ trunk/teraterm/ttpcmn/ttcmn.c	2015-11-05 11:44:40 UTC (rev 6076)
@@ -2307,6 +2307,32 @@
 	return comports;
 }
 
+int PASCAL CheckComPort(WORD ComPort)
+{
+	HMODULE h;
+	TCHAR   devicesBuff[65535];
+	char    com_str[64];
+
+	_snprintf_s(com_str, sizeof(com_str), _TRUNCATE, "COM%d", ComPort);
+
+	if (((h = GetModuleHandle("kernel32.dll")) == NULL) | (GetProcAddress(h, "QueryDosDeviceA") == NULL) ) {
+		/* ERROR */
+		return -1;
+	}
+	if (QueryDosDevice(com_str, devicesBuff, 65535) != 0) {
+		return 1;
+	}
+	else {
+		DWORD err = GetLastError();
+		if (err == ERROR_FILE_NOT_FOUND) {
+			/* NOT FOUND */
+			return 0;
+		}
+		/* ERROR */
+		return -1;
+	}
+}
+
 BOOL WINAPI DllMain(HANDLE hInstance,
                     ULONG ul_reason_for_call,
                     LPVOID lpReserved)

Modified: trunk/teraterm/ttpcmn/ttpcmn.def
===================================================================
--- trunk/teraterm/ttpcmn/ttpcmn.def	2015-11-05 11:25:37 UTC (rev 6075)
+++ trunk/teraterm/ttpcmn/ttpcmn.def	2015-11-05 11:44:40 UTC (rev 6076)
@@ -57,3 +57,5 @@
 
   GetParam @62
   DequoteParam @63
+
+  CheckComPort @64



Ttssh2-commit メーリングリストの案内
アーカイブの一覧に戻る