From eababe835409479b88ae0ed8beb433214789ff86 Mon Sep 17 00:00:00 2001 From: tnishi Date: Fri, 25 Nov 2016 18:46:57 +0900 Subject: [PATCH] =?utf8?q?DDE=20Request=E3=81=AE=E5=AF=BE=E5=BF=9C?= =?utf8?q?=E8=BF=BD=E5=8A=A0=E3=80=81GetPdicVersion=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- DCHookTest/DCHookMain.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++++ DCHookTest/DCHookMain.h | 1 + 2 files changed, 46 insertions(+) diff --git a/DCHookTest/DCHookMain.cpp b/DCHookTest/DCHookMain.cpp index dffd19d..5e896d0 100644 --- a/DCHookTest/DCHookMain.cpp +++ b/DCHookTest/DCHookMain.cpp @@ -64,6 +64,7 @@ bool DdePoke( TDdeClientConv *dde, AnsiString Item, AnsiString Data ); #ifdef USE_UNICODE // Unicode‚Å“n‚·ê‡ bool DdePoke( TDdeClientConv *dde, AnsiString Item, const wchar_t *Data ); +bool DdeRequest( TDdeClientConv *dde, AnsiString Item, char *Data, int &inoutDataLen ); #endif; void GetGroupList(TMyIni &ini, TStringList &list); @@ -945,6 +946,25 @@ bool DdePoke( TDdeClientConv *dde, AnsiString Item, const wchar_t *Data ) DdeFreeDataHandle( hdata ); } } + DdeFreeStringHandle(ddeMgr->DdeInstId, hszItem); + return r; +} +bool DdeRequest( TDdeClientConv *dde, AnsiString Item, char *Data, int &ioDataLen ) +{ + const int ddeFmt = /*dde->DdeFmt*/CF_UNICODETEXT; + HSZ hszItem = DdeCreateStringHandle(ddeMgr->DdeInstId, Item.c_str(), CP_WINANSI ); + if ( !hszItem ) return false; + bool r = false; + HDDEDATA hdata = DdeClientTransaction( NULL, 0, (HCONV)dde->Conv, hszItem, ddeFmt, XTYP_REQUEST, 10000, NULL); + if (hdata || DdeGetLastError(ddeMgr->DdeInstId) != DMLERR_NO_ERROR){ + r = true; + if (hdata){ + ioDataLen = DdeGetData(hdata, (LPBYTE)Data, ioDataLen, 0); + DdeFreeDataHandle( hdata ); + } else { + Data[0] = '0'; + ioDataLen = 0; + } } DdeFreeStringHandle(ddeMgr->DdeInstId, hszItem); return r; @@ -1017,6 +1037,31 @@ void TDCHookMainForm::ClosePdic( TDdeClientConv *dde ) dde->CloseLink(); delete dde; } +// XX.XX.XXXX (hex) 1+1+2 byte\¬ +int TDCHookMainForm::GetPdicVersion() +{ + TDdeClientConv *PdicDde = OpenPdic("PDIC"); + if (!PdicDde) return 0; + int version = 0; +#ifdef USE_UNICODE + char buf[40]; + if (DdeRequest(PdicDde, "GetVersion", buf, sizeof(buf))){ + wchar_t *str = (wchar_t*)buf; + version = _wtoi( str ) << 24; + const wchar_t *p = wcschr( str, '.' ); + if (p){ + version |= _wtoi( p+1 ) << 16; + p = wcschr( p+1, '.' ); + if (p){ + version |= _wtoi( p+1 ); + } + } + //DBW("version: %X", version); + } +#endif + ClosePdic( PdicDde ); + return version; +} // click_pos: mouse click‚³‚ꂽtextã‚Ì•¶ŽšˆÊ’u(textæ“ª‚©‚ç‚Ìoffset) bool TDCHookMainForm::DoPopup( const tchar *text, int click_pos, const tchar *prevtext, bool movesend ) { diff --git a/DCHookTest/DCHookMain.h b/DCHookTest/DCHookMain.h index f8eec37..ace6feb 100644 --- a/DCHookTest/DCHookMain.h +++ b/DCHookTest/DCHookMain.h @@ -169,6 +169,7 @@ public: // void OpenDicGroup( const char *name ); TDdeClientConv *OpenPdic( const char *topic ); void ClosePdic( TDdeClientConv *dde ); + int GetPdicVersion(); // WM_COPYDATA control // HWND FindPdic( ); -- 2.11.0