У меня была похожая проблема с вами ... моя была вызвана смешением Unicode и встроенного кода MBCS .... может быть, это было вашей основной причиной?
Мне пришлось преобразовать приложение MBCS в Unicode, но преобразовать весь проект было невозможно, поэтому мне пришлось смешивать скомпилированный код Unicode (приложение) и код, скомпилированный MBCS (библиотеки DLL).
Некоторые из библиотек MBCS были библиотеками расширения MFC, другие были обычными DLL.
Одна из библиотек расширения MFC содержала ресурсы (список растровых изображений и общие диалоговые окна).
Я не конвертировал DLL в UNICODE, потому что в ней было много зависимых DLL, которые также пришлось бы конвертировать, и, кроме того, мне не требовались элементы управления в общих диалоговых окнах для поддержки текста Unicode.
Так что я сохранил DLL как MBCS и использовал AfxSetResourceHandle до использования любого класса в DLL MBCS, который использовал ресурсы ..... это было сделано для того, чтобы ресурсы извлекались из DLL напрямую, а не через ресурс MFC цепочка, потому что MFC не может найти ресурсы не-Unicode в противном случае.
Полагаю, MFC не нравится, когда у вас есть смесь скомпилированного кода Unicode и не-Unicode, содержащего ресурсы ..... поиск в цепочке ресурсов завершается неудачно (я думаю, что это как-то связано с преобразованием идентификаторов ресурсов) в строку идентификатора, т.е. через MAKEINTRESOURCE).
Я сделал основное приложение UNICODE и убедился, что заголовки C ++ классов в DLL-библиотеках MBCS использовали CStringA в прототипах функций или принимали широкие строки и выполняли преобразование внутри.
Я обнаружил, что мое приложение не будет корректно завершать работу ... оно будет оставаться в вызове MFC CWinThread :: PumpMessage / AfxInternalPumpMessage (), а ExitInstance никогда не будет вызываться.
Чтобы решить эту проблему, в моем CMainFrame :: OnDestroy () я поместил следующее как последние 2 утверждения:
void CMainFrame::OnDestroy()
{
....
CFrameWnd::OnDestroy();
AfxPostQuitMessage(0);
}