Я наконец понял, что это ошибка кодов MFC (версия VC6.0).
Я не знаю, могу ли я публиковать исходные коды MFC, поэтому я просто вставлю заголовки функций и связанные частитолько.
В Microsoft Visual Studio \ VC98 \ MFC \ SRC \ STRCORE.CPP мы можем видеть следующие 3 функции:
//////////////////////////////////////////////////////////////////////////////
// More sophisticated construction
CString::CString(LPCTSTR lpsz) // Function 1
{
Init();
if (lpsz != NULL && HIWORD(lpsz) == NULL)
{
UINT nID = LOWORD((DWORD)lpsz);
if (!LoadString(nID))
TRACE1("Warning: implicit LoadString(%u) failed\n", nID);
}
else
{
// Construct string normally
}
}
/////////////////////////////////////////////////////////////////////////////
// Special conversion constructors
#ifdef _UNICODE
CString::CString(LPCSTR lpsz) // Function 2
{
// Construct string normally
}
#else //_UNICODE
CString::CString(LPCWSTR lpsz) // Function 3
{
// Construct string normally
}
#endif //!_UNICODE
Как мы видим в приведенном выше фрагменте кода,только функция 1 содержит коды, которые возьмут специальный процесс на lpsz и проверит, является ли он строковым идентификатором ресурса; если да, то загрузите строку из ресурса. Обе функции 2 и 3 не имеют таких специальных процессов.
Когда мы создаем проект в VS6, настройки по умолчанию для проекта - _MBCS, в таком случае функция 1 станет
CString::CString(LPCSTR lpsz)
поэтому CString ((LPCSTR) nResID) фактически вызовет функцию 1 и правильно загрузит строковый ресурс.
Функция 2 будет отключена, поскольку _UNICODE не определен. И функция 3 работает с широкими символьными строками.
Следовательно, для проекта _MBCS все работает идеально и согласованно с документом MSDN.
Однако, когда я изменяю _MBCS на _UNICODE, функция 1 становится
CString::CString(LPCWSTR lpsz)
Функция 2 будет включена и функция 3 будет отключена.
Таким образом, CString ((LPCSTR) nResID) фактически вызовет функцию 2, которая НЕ имеет специального процесса для загрузки строкиресурс, который создает проблему.
Существует два решения этой проблемы:
Всегда использовать CString ((LPCTSTR) nResID) вместо CString ((LPCSTR) nResID) загрузить строку из ресурса. Однако это использование несовместимо с документом MSDN, поэтому мы должны называть его недокументированным использованием.
Всегда использовать LoadString для загрузки строкового ресурса.
Хотя решение 1 немного проще, оно недокументировано, поэтому я, наконец, выбрал решение 2 для решения своей проблемы.
Большое спасибо за помощь в решенииэтот выпуск.