Skip to content

Commit 306a9eb

Browse files
committed
mircsendmessageapi.h: v3
1 parent d2b999f commit 306a9eb

1 file changed

Lines changed: 22 additions & 17 deletions

File tree

src/mircsendmessageapi.h

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,33 @@
88
#pragma once
99

1010
#include <Windows.h>
11-
#include <Strsafe.h>
1211
#include <string>
12+
#include <Strsafe.h>
1313

1414
class CMIRCSendMessageAPI
1515
{
1616
public:
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

Comments
 (0)