Существует ли полезный класс оболочки C ++ для строк загрузки ресурсов Windows? - PullRequest
4 голосов
/ 06 января 2011

Мы работаем над локализацией нашего приложения, и теперь у нас есть задача исправить все жестко запрограммированные строки в LoadString () и т. Д.

Я быстро взглянул на этот класс , но удивляюсь, использовал ли кто-нибудь другие хорошие обертки.

Некоторые требования / приятно иметь:

  • краткие замены для жестко закодированных строк - мы не хотим добавлять строки и строки кода.
  • бесплатно и без роялти

EDIT Еще немного информации - жестко закодированные строки были по всему коду. Иногда они были преобразованы компилятором в CString, иногда в std :: string, а иногда просто в простой старый char *.

Мы хотим свести к минимуму изменения в кодовой базе (250 тыс. + Строк кода), и мы не будем особо помогать местам, где все строки используются в качестве разных типов.

Таким образом, класс / метод должен выполнять множественные обязанности как wchar, CString, std :: string и т.д ...

Ответы [ 3 ]

4 голосов
/ 07 января 2011

Я думаю, что класс это слишком.Я использую это:

inline const wchar_t * LoadResourceString(UINT resourceId)
{
    wchar_t * buff;
    int requiredLen = LoadStringW(
        GetModuleHandle(0), // Replace this with your HINSTANCE if
                            // using a resource DLL of course :)
        resourceId,
        reinterpret_cast<LPWSTR>(&buff),
        0);
    if (requiredLen == 0)
    {
        THROW_LAST_WINDOWS_ERROR();
    }
    return buff;
}

РЕДАКТИРОВАТЬ: Конечно, вам нужно было бы поместить куда-нибудь HINSTANCE, если вы намеревались использовать это в DLL-библиотеке ресурсов.При этом предполагается, что строки ресурсов экодированы как часть одного двоичного файла.

1 голос
/ 07 января 2011

Вот что я использую:

extern HINSTANCE GetResourceInstance(); //Define elsewhere, or use a global hInst

template<int N>
class LoadStringRes
{
    TCHAR tszString[N+1];
public:
    LoadStringRes(int ID)
    {
        ::LoadString(GetResourceInstance(), ID, tszString, sizeof(tszString)/sizeof(tszString[0]));
    }

    operator const TCHAR*() const
    {
        return tszString;
    }
};

Используйте таким образом:

MyFunctionThatNeedsAString(LoadStringRes<100>(IDS_HELLO));

Это похоже на вызов функции, но это действительно конструкция объекта / использование / уничтожение / использование.

Недостатком является то, что вы должны знать приблизительную длину строки. Это цена автоматического распределения памяти в стеке.

0 голосов
/ 07 января 2011

Взгляните на wxWidgets .Это увеличит ваш распространяемый установочный файл, но он очень мощный и предоставляет множество функций (в дополнение к тому, что вы ищете) очень элегантно и эффективно (да, это бесплатно и бесплатно).бесплатно).

...