88#pragma once
99
1010#include < Windows.h>
11- #include < Strsafe.h>
1211#include < string>
12+ #include < Strsafe.h>
1313
1414class CMIRCSendMessageAPI
1515{
1616public:
1717 CMIRCSendMessageAPI (HWND hwnd)
18- : m_hwnd(hwnd), m_mappingHandle( INVALID_HANDLE_VALUE ), m_dataPtr( nullptr ), m_mappingNameIndex( 0 )
18+ : m_hwnd(hwnd), m_mappingNameIndex( 0 ), m_mappingHandle( INVALID_HANDLE_VALUE ), m_dataPtr( nullptr )
1919 {
2020 }
2121
2222 CMIRCSendMessageAPI (const CMIRCSendMessageAPI&) = delete ;
2323
2424 bool Connect ()
2525 {
26+ // start at higher number because simple/stupid scripts use "mIRC" (= 0) and we do not want to break them:
27+ const int INDEX_OFFSET = 80 ;
28+
2629 wchar_t mappingName[10 ] = { 0 };
2730 int index = 0 ;
2831
2932 while (m_mappingHandle == INVALID_HANDLE_VALUE )
3033 {
31- ++index; // start at 1 because simple/stupid scripts use "mIRC" (= 0) and we do not want to break them
32-
33- if (index > 32 )
34+ if (index++ > 32 )
3435 break ;
3536
36- ::StringCchPrintfW (mappingName, 10 , L" mIRC%d" , index);
37+ ::StringCchPrintfW (mappingName, 10 , L" mIRC%d" , index + INDEX_OFFSET );
3738
3839 ::SetLastError (ERROR_SUCCESS );
3940
@@ -50,10 +51,10 @@ class CMIRCSendMessageAPI
5051 {
5152 if (!m_dataPtr)
5253 {
53- m_dataPtr = ::MapViewOfFile (m_mappingHandle, FILE_MAP_ALL_ACCESS , 0 , 0 , 0 );
54+ m_dataPtr = ::MapViewOfFile (m_mappingHandle, FILE_MAP_WRITE | FILE_MAP_READ , 0 , 0 , 0 );
5455 }
5556
56- m_mappingNameIndex = index;
57+ m_mappingNameIndex = index + INDEX_OFFSET ;
5758 }
5859
5960 return (m_mappingHandle && m_dataPtr);
@@ -66,7 +67,7 @@ class CMIRCSendMessageAPI
6667
6768 ::StringCbCopyA (reinterpret_cast <char *>(m_dataPtr), MAPPING_SIZE, cmd.c_str());
6869
69- return MIRCSendMessage (WM_MCOMMAND , 1 , eventId);
70+ return SendMIRCMessage (WM_MCOMMAND , 1 , eventId);
7071 }
7172
7273 bool SendCommand (const std::wstring& cmd, unsigned short eventId = 0 ) const
@@ -76,7 +77,7 @@ class CMIRCSendMessageAPI
7677
7778 ::StringCbCopyW (reinterpret_cast <wchar_t *>(m_dataPtr), MAPPING_SIZE, cmd.c_str());
7879
79- return MIRCSendMessage (WM_MCOMMAND , 1 | METHOD_UNICODE , eventId);
80+ return SendMIRCMessage (WM_MCOMMAND , 1 | METHOD_UNICODE , eventId);
8081 }
8182
8283 bool EvaluateCommand (const std::string& cmd, std::string& result, unsigned short eventId = 0 ) const
@@ -88,11 +89,12 @@ class CMIRCSendMessageAPI
8889
8990 ::StringCbCopyA (dataPtr, MAPPING_SIZE , cmd.c_str());
9091
91- if (MIRCSendMessage (WM_MEVALUATE , 0 , eventId)
92- && SUCCEEDED (::StringCbLengthA (dataPtr, MAPPING_SIZE - 1 , NULL ))
92+ size_t resultLength = 0 ;
93+ if (SendMIRCMessage (WM_MEVALUATE , 0 , eventId)
94+ && SUCCEEDED (::StringCbLengthA (dataPtr, MAPPING_SIZE - 1 , &resultLength))
9395 )
9496 {
95- result = std::string (dataPtr);
97+ result = std::string (dataPtr, resultLength );
9698
9799 return true ;
98100 }
@@ -109,11 +111,12 @@ class CMIRCSendMessageAPI
109111
110112 ::StringCbCopyW (wDataPtr, MAPPING_SIZE , cmd.c_str());
111113
112- if (MIRCSendMessage (WM_MEVALUATE , METHOD_UNICODE , eventId)
113- && SUCCEEDED (::StringCbLengthW (wDataPtr, MAPPING_SIZE - 1 , NULL ))
114+ size_t resultLength = 0 ;
115+ if (SendMIRCMessage (WM_MEVALUATE , METHOD_UNICODE , eventId)
116+ && SUCCEEDED (::StringCchLengthW (wDataPtr, (MAPPING_SIZE - 1 ) / sizeof (wchar_t ), &resultLength))
114117 )
115118 {
116- result = std::wstring (wDataPtr);
119+ result = std::wstring (wDataPtr, resultLength );
117120
118121 return true ;
119122 }
@@ -138,7 +141,7 @@ class CMIRCSendMessageAPI
138141 HANDLE m_mappingHandle;
139142 void *m_dataPtr;
140143
141- bool MIRCSendMessage (UINT msg, WORD method, WORD eventId) const
144+ bool SendMIRCMessage (UINT msg, WORD method, WORD eventId) const
142145 {
143146 const WORD USEFUL_RETURN_CODES = 16 ;
144147
@@ -147,3 +150,5 @@ class CMIRCSendMessageAPI
147150 return (::SendMessageW (m_hwnd, msg, MAKEWPARAM (method | USEFUL_RETURN_CODES , eventId), m_mappingNameIndex) == 0 );
148151 }
149152};
153+
154+ static_assert (sizeof (char ) == 1 , " sizeof char ?= 1" );
0 commit comments