LoadString с nBufferMax, равным 0 - PullRequest
       1

LoadString с nBufferMax, равным 0

3 голосов
/ 18 декабря 2011

Я работаю над тем, чтобы сделать свои заявки международными. После двух дней копания на msdn я придумал тест, который загружает библиотеку для конкретного языка, содержащую ресурсы. Это также моя первая попытка загрузить библиотеку как ресурс, загрузить из нее строки и так далее.

Далее, в соответствии с примером msdn на http://msdn.microsoft.com/en-us/library/windows/desktop/dd319071%28v=VS.85%29.aspx, я пытаюсь загрузить LoadString.

Поскольку загрузка строк для всего приложения равняется большому количеству копирования текста, я подумал, что я бы использовал - как мне кажется, - функцию экономии памяти в LoadString, которая устанавливает параметр nBufferMax в ноль. Согласно документации LoadString, он должен возвращать указатель на строковый ресурс. Я думал, что сделаю структуру или класс строковых указателей и сделаю что-то вроде этого (я извлек только важные биты):

wchar_t textBuf[SOMEVALUE]; // <-- this is how id DOES work
wchar_t *myString; // <-- this is how i would like it
HMODULE resContainer=LoadLibraryEx(L"MUILibENU.dll",NULL, LOAD_LIBRARY_AS_DATAFILE);
if(0!=resContainer){
  // this works OK
  int copied=LoadStringW(resContainer,IDS_APP_TITLE,textBuf,SOMEVALUE); 
  // this fails, also gives a warning at compile time about uninitialized variable used.
  int copied=LoadStringW(resContainer,IDS_APP_TITLE,myString,0);
}

Как вы можете видеть, я пытаюсь заставить myString стать указателем на строку загруженной библиотеки ресурсов, фактически ничего не копируя. Мой вопрос: я неправильно понимаю документацию MSDN? Могу я или не могу получить указатель на строку непосредственно в загруженной библиотеке, а просто использовать ее позже, например, показать окно сообщения, фактически ничего не копируя? Пока я не выгружу указанную библиотеку?

1 Ответ

4 голосов
/ 18 декабря 2011

MSDN говорит:

[...] Если этот параметр равен 0, то lpBuffer получает доступный только для чтения указатель на сам ресурс.

Это означаетчто а) указатель должен иметь тип const wchar_t*:

const wchar_t *myString;

и б) вы должны передать указатель на указатель и использовать некрасивое приведение:

int copied=LoadStringW(resContainer,IDS_APP_TITLE,(LPWSTR)&myString,0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...