Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > LoadString строки из другого проекта


Автор: NiJazz 26.7.2005, 10:12
Например, есть два MFC-приложения. В одном из них есть String Table со строками и идентификаторами. Как можно строки этого ресурса использовать в другом проекте?
Добавлено @ 10:13
Ну разумеется, что второй проект поддерживает MFC и всё необходимое.

Автор: Coocky 26.7.2005, 10:41
NiJazz
Да никак, сорей всего, как ты к таблице другой достучишься?
Или я не понял вопрос-тебе перенести в свою надо или работать с чужой??

Автор: chaos 26.7.2005, 10:47
все просто) см. пример
Код

#include <stdio.h>
#include <windows.h>
#include "./2/resource.h"

int main(int argc, char* argv[])
{
    HINSTANCE hInst = ::LoadLibrary(".\\2\\debug\\2.exe");
    if (NULL == hInst)
    {
        printf("Error load library\n");
        return 0;
    }

    char str1[100], str2[100];
    ::LoadString(hInst, IDS_STRING1, str1, 100);
    printf("String1 = %s\n", str1);
    ::LoadString(hInst, IDS_STRING2, str2, 100);
    printf("String2 = %s\n", str2);

    ::FreeLibrary(hInst);

    return 0;
}

поясняю: у тебя есть пирложение и допустим ты знаешь идентификаторы строк(те у тебя есть resource.h), ну а осьтальное думаю все понятно

Автор: chaos 26.7.2005, 10:57
но это только при знании идентификаторов ресурсов

Автор: Coocky 26.7.2005, 11:00
chaos
А ну-ка обьясни, что ты делаешь-загружаешь таблицу и читаешь из нее строки?
Хм...
Надо справочник по API функциям купить smile

Автор: chaos 26.7.2005, 11:09
сдесь я делаю: зная какие есть идентификаторы строк в программе(имею resource.h ее) я загружаю строки по их идентификатору. так! но может это не то что нужно автору топика smile

Автор: Coocky 26.7.2005, 11:20
chaos
Я вообще не пойму, зачем такое, если можно просто скопи-пастить в свою таблицу..
Ну ладно, если прийдет. пусть скажет..
А пример вообще интересный.

Автор: chaos 26.7.2005, 11:26
Цитата(Coocky @ 26.7.2005, 11:20)
chaos
Я вообще не пойму, зачем такое, если можно просто скопи-пастить в свою таблицу..
Ну ладно, если прийдет. пусть скажет..
А пример вообще интересный.

а вдруг у кого-то есть exe и resource.h и больше ни чего, тогда таким макаром можно дергать строчки smile

Автор: NiJazz 26.7.2005, 17:18
Coocky
Цитата
если можно просто скопи-пастить в свою таблицу..

Можно, но нетехнологично.
Добавлено @ 17:23
chaos
Спасибо, я думаю, что метод работающий. То есть берем бинарник, извлекаем нужный ресурс и пользуемся им.
Но мне бы хотелось пользоваться строками из rc-файла, а не скомпонованного бинарника, так как эти два проекта в одном решении. А сидеть и копировать таблицу я бы не хотел, к тому же так могут быть ошибки (так как работа копипастера слишком машинальная).

Автор: Coocky 26.7.2005, 17:23
NiJazz
Ну, дык , работает пример chaos_а?

Добавлено @ 17:25
Дык прочитать можно-то файл?
Цитата

STRINGTABLE
BEGIN
    ID_INDICATOR_EXT        "EXT"
    ID_INDICATOR_CAPS      "CAP"
    ID_INDICATOR_NUM        "NUM"
    ID_INDICATOR_SCRL      "SCRL"
    ID_INDICATOR_OVR        "OVR"
    ID_INDICATOR_REC        "REC"
END

Вот из rc файла строка из таблицы...

Автор: Earnest 26.7.2005, 17:45
Цитата(NiJazz @ 26.7.2005, 17:18)
То есть берем бинарник, извлекаем нужный ресурс и пользуемся им.

Все правильно, метод точно работает. Только грузить библиотеку\exe надо через LoadLibraryEx с флагом DONT_RESOLVE_DLL_REFERENCES или LOAD_LIBRARY_AS_DATAFILE. Иначе она попробует разрешить все свои связи, а оно вам надо? Может и не получиться. Список ресурсов потом можно получить через разнообразные функции EnumResourseXXX, а конкретный ресурс - через LoadString, LoadIcon, etc.

Цитата(NiJazz @ 26.7.2005, 17:18)
Но мне бы хотелось пользоваться строками из rc-файла, а не скомпонованного бинарника, так как эти два проекта в одном решении

Если два проекта (EXE) разделяют ресурсы - самое разумное вынести эти ресурсы в отдельную DLL и подключить ее к обоим проектам.
Если общие ресурсы засунуть в MFC-extension DLL, то MFC приложение и само все найдет, нужно только позаботиться о разделении пулов идентитфикаторов. Потому как код MFC, например CWinApp::LoadString, ищет сначала нужный ресурс в заданном модуле (по-умолчанию - exe модуль), а потом по всей цепочке extension DLL. У кого первого найдет, того и тапки.

Автор: chaos 27.7.2005, 06:19
сдесь вот тоже чето подобное обсуждается
http://forum.vingrad.ru/index.php?showtopic=58391&st=0&unread=#entry477039

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)