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