Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получения строкового ресурса, (когда длина не известна) 
:(
    Опции темы
np9mi7
  Дата 26.10.2005, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Добрый день.

Есть задача: Имеется *.dll с ресурсами. Необходимо написать функцию получения строки из этого ресурса.
Код

std::string GetResourtString (const HINSTANCE const, const signed int) throw (std::exception);


Проблема решения:
Цитата

int LoadString(          HINSTANCE hInstance,
    UINT uID,
    LPTSTR lpBuffer,
    int nBufferMax
);


Цитата
hInstance
[in] Handle to an instance of the module whose executable file contains the string resource. To get the handle to the application itself, use GetModuleHandle(NULL).
uID
[in] Specifies the integer identifier of the string to be loaded.
lpBuffer
[out] Pointer to the buffer to receive the string.
nBufferMax
[in] Specifies the size of the buffer, in TCHARs. This refers to bytes for ANSI versions of the function or WCHARs for Unicode versions. The string is truncated and NULL terminated if it is longer than the number of characters specified.


Те при получении строкового ресурса нужно знать его длину.

Как быть? Как получить строковый ресурс не зная его размер?

Заранее благодарен за ответы.

ps:

CStringT::LoadString

Цитата
BOOL LoadString(
  HINSTANCE hInstance,
  UINT nID,
  WORD wLanguageID
);
BOOL LoadString(
  HINSTANCE hInstance,
  UINT nID
);
BOOL LoadString(
  UINT nID
);


Это возможно! Есть такие методы! Вот только как..........???

Это сообщение отредактировал(а) np9mi7 - 26.10.2005, 20:11


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
LPBOY
Дата 26.10.2005, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Не очень разбираюсь в этих вещах... Посмотрел в МСДН - в сторону функции SizeofResource не пробовал смотреть?
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
bel_nikita
Дата 26.10.2005, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Вот, реализация CString:
Код

BOOL CString::LoadString(UINT nID)
{
    // try fixed buffer first (to avoid wasting space in the heap)
    TCHAR szTemp[256];
    int nLen = AfxLoadString(nID, szTemp, _countof(szTemp));
    if (_countof(szTemp) - nLen > CHAR_FUDGE)
    {
        *this = szTemp;
        return nLen > 0;
    }

    // try buffer size of 512, then larger size until entire string is retrieved
    int nSize = 256;
    do
    {
        nSize += 256;
        nLen = AfxLoadString(nID, GetBuffer(nSize-1), nSize);
    } while (nSize - nLen <= CHAR_FUDGE);
    ReleaseBuffer();

    return nLen > 0;
}
int AFXAPI AfxLoadString(UINT nID, LPTSTR lpszBuf, UINT nMaxBuf)
{
    ASSERT(AfxIsValidAddress(lpszBuf, nMaxBuf*sizeof(TCHAR)));
#ifdef _DEBUG
    // LoadString without annoying warning from the Debug kernel if the
    //  segment containing the string is not present
    if (::FindResource(AfxGetResourceHandle(),
       MAKEINTRESOURCE((nID>>4)+1), RT_STRING) == NULL)
    {
        lpszBuf[0] = '\0';
        return 0; // not found
    }
#endif //_DEBUG
    int nLen = ::LoadString(AfxGetResourceHandle(), nID, lpszBuf, nMaxBuf);
    if (nLen == 0)
        lpszBuf[0] = '\0';
    return nLen;
}


З.Ы.: Только я бы не использовал std::string, а то вдруг юникод понадобится


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
np9mi7
Дата 26.10.2005, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Всем огромное спасибо! bel_nikita, тебе отдельное...
Цитата
З.Ы.: Только я бы не использовал std::string, а то вдруг юникод понадобится
, это же typedef basic_string, так что если понадобиться, то можно новую функцию написать.

ps: мог бы и сам догадаться в исходник CString, из головы как то вылетело...


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
DeadSoul
Дата 26.10.2005, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



np9mi7, try
Код

int LoadString(          hInstance,
   uID,
   0,
    0
);

многие Api функции в этом случае длину буфера возвращают


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
srd
Дата 27.10.2005, 05:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Код

typedef std::basic_string<TCHAR> tstring;

template<typename T>
void LoadResString( const HINSTANCE hInstance, const UINT id, std::basic_string<T>& string );

template<>
inline void LoadResString( const HINSTANCE hInstance, const UINT id, std::basic_string<char>& string )
{
    string.clear();

    HRSRC hResInfo = FindResourceA( hInstance,
        MAKEINTRESOURCEA( 1 + ( id / 16 ) ),
        reinterpret_cast<LPCSTR>( RT_STRING ) );

    if( hResInfo == NULL )
        return;

    LPCWSTR res = reinterpret_cast<LPCWSTR>( LoadResource( hInstance, hResInfo ) );

    for( WORD pos = 0; pos < ( id & 0x000f ); ++pos )
        res += *res + 1;

    size_t length = *reinterpret_cast<const unsigned short*>( res ) + 1;
    std::vector<char> buffer( length );

    length = WideCharToMultiByte( CP_ACP,
        0UL,
        res + 1,
        static_cast<int>( length ),
        &buffer[0],
        static_cast<int>( length ),
        NULL,
        NULL );

    string.assign( buffer.begin(), buffer.begin() + length );
}

template<>
inline void LoadResString( const HINSTANCE hInstance, const UINT id, std::basic_string<wchar_t>& string )
{
    string.clear();

    HRSRC hResInfo = FindResourceW( hInstance,
        MAKEINTRESOURCEW( 1 + ( id / 16 ) ),
        reinterpret_cast<LPCWSTR>( RT_STRING ) );

    if( hResInfo == NULL )
        return;

    LPCWSTR res = reinterpret_cast<LPCWSTR>( LoadResource( hInstance, hResInfo ) );

    for( WORD pos = 0; pos < ( id & 0x000F ); ++pos )
        res += *res + 1;

    size_t length = *reinterpret_cast<const unsigned short*>( res ) + 1;
    
    string.assign( res + 1, res + length );
}


Это сообщение отредактировал(а) srd - 27.10.2005, 05:59


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
np9mi7
Дата 27.10.2005, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Ну вообще все хорошо, разжевали всё по полной.......


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0459 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.