Вы можете предварительно загрузить их, если хотите.Вам просто нужно создать массив строковых указателей и загрузить каждую строку в этот массив.Или вы можете использовать хэш-карту или что-то подобное.
Плохо для производительности?Это зависит.Если вы отображаете эти строки в виде подсказок в пользовательском интерфейсе, я не вижу, как загрузка каждой строки по мере необходимости будет проблемой производительности.В любом случае, операционная система будет выполнять интеллектуальное кэширование, поэтому не похоже, что вы будете нажимать на диск для каждой строки, которую вам нужно отобразить.С другой стороны, если вы собираетесь работать с этими строками в тесном цикле, то, вероятно, лучше предварительно загрузить их в память, чтобы вам не приходилось постоянно вызывать LoadString
.
Что касается буферов, я всегда выделял буфер размером до самой большой строки, которую я ожидал иметь в своем файле ресурсов.Учитывая, что строки пользовательского интерфейса обычно очень малы, 256-байтовый буфер был более чем достаточным.Что-нибудь большее, чем это, я бы либо предварительно загрузил в память при запуске, чтобы я мог сохранить это, либо я написал отдельный метод, который будет выделять строку во время загрузки, а не хранить буфер вокруг.
Дополнительная информация:
Вместо того, чтобы определять глобальные переменные для ваших строк, рассмотрите возможность написания функции, которая загружает строку ресурса, создает ее копию и возвращает эту копию.То есть:
char * LoadStringFromResource(uint id)
{
// szBuffer is a globally pre-defined buffer of some maximum length
LoadString(ghInst, id, szBuffer, bufferSize);
// yes, I know that strdup has problems. But you get the idea.
return strdup(szBuffer);
}
Ваш код становится:
char* errMem = LoadStringFromResource(IDS_ERROR_MEMORY);
char* errText = LoadStringFromResource(IDS_ERROR_TEXT);
MessageBox(NULL, errMem, errText, MB_OK | MB_ICONERROR);
free(errMem);
free(errText);
Выше приведен код C, но вы можете легко преобразовать его в C ++.В частности, вы, вероятно, захотите изменить функцию-оболочку так, чтобы она возвращала строку C ++ - то, что будет автоматически освобождено, когда она выйдет из области видимости (с использованием интеллектуальных указателей или любого другого современного эквивалента).