Привет! Если кто-то знает — помогите. Мне нужно получить всю иерархию классов MFC, то есть как бы обойти всё дерево, чтобы в дальнейшем эту информацию где-то использовать...
Здравствуйте, Zergulius, Вы писали:
Z>Привет! Если кто-то знает — помогите. Мне нужно получить всю иерархию классов MFC, то есть как бы обойти всё дерево, чтобы в дальнейшем эту информацию где-то использовать...
Всю скорее всего не получится. Можно получить список классов, объявленных как сериализуемые(DECLARE_SERIAL).
При инициализации модуля их RuntimeClass поля регистрируются в списке m_classList класса AFX_MODULE_STATE.
Здравствуйте, Max_Akimov, Вы писали:
MA>Всю скорее всего не получится. Можно получить список классов, объявленных как сериализуемые(DECLARE_SERIAL). MA>При инициализации модуля их RuntimeClass поля регистрируются в списке m_classList класса AFX_MODULE_STATE.
MA>
Спасибо за совет, но список гипотетических RuntimeClassoв пуст.Может список заполняется рантаймами только созданных, а не базовых(mfc), сериализуемых классов...
Здравствуйте, Max_Akimov, Вы писали:
MA>Здравствуйте, Zergulius, Вы писали:
Z>>Привет! Если кто-то знает — помогите. Мне нужно получить всю иерархию классов MFC, то есть как бы обойти всё дерево, чтобы в дальнейшем эту информацию где-то использовать...
MA>Всю скорее всего не получится. Можно получить список классов, объявленных как сериализуемые(DECLARE_SERIAL). MA>При инициализации модуля их RuntimeClass поля регистрируются в списке m_classList класса AFX_MODULE_STATE.
MA>
Z>Спасибо за совет, но список гипотетических RuntimeClassoв пуст.Может список заполняется рантаймами только созданных, а не базовых(mfc), сериализуемых классов...
Он заполняется классами которые линкуются к твоему модулю.
если проект собирается как Use MFC in a Shared DLL, то базовые классы
попадут в список в mfc.dll
Здравствуйте, Max_Akimov, Вы писали:
MA>Здравствуйте, Zergulius, Вы писали:
MA> Z>>Спасибо за совет, но список гипотетических RuntimeClassoв пуст.Может список заполняется рантаймами только созданных, а не базовых(mfc), сериализуемых классов...
MA>Он заполняется классами которые линкуются к твоему модулю. MA>если проект собирается как Use MFC in a Shared DLL, то базовые классы MA>попадут в список в mfc.dll
а как сделать, чтобы базовые классы попали в myapp.exe!!?? Sorry za dostavanie...
Здравствуйте, Zergulius, Вы писали:
Z>Привет! Если кто-то знает — помогите. Мне нужно получить всю иерархию классов MFC, то есть как бы обойти всё дерево, чтобы в дальнейшем эту информацию где-то использовать...
А для чего вам это и как вы собираетесь ее использовать? Можете поподробнее?
Здравствуйте, Serguei666, Вы писали:
S>Здравствуйте, Zergulius, Вы писали:
Z>Привет! Если кто-то знает — помогите. Мне нужно получить всю иерархию классов MFC, то есть как бы обойти всё дерево, чтобы в дальнейшем эту информацию где-то использовать... S>А для чего вам это и как вы собираетесь ее использовать? Можете поподробнее?
Да так, ничего интересного...Просто лабу делаю..Вообще то задание было проще, просто интересно стало.. Хочу полученную инфомацию о mfc классах вывести в CTreeCtrl в виде дерева..Это же просто(просто я не знаю),неужели никто не поможет: не сам же я буду делать...Буду ждать.Обещаю высокие отметки. подумайте — деловое предложение...
Здравствуйте, Zergulius, Вы писали:
Z>Здравствуйте, Serguei666, Вы писали:
S>Здравствуйте, Zergulius, Вы писали:
Z>Привет! Если кто-то знает — помогите. Мне нужно получить всю иерархию классов MFC, то есть как бы обойти всё дерево, чтобы в дальнейшем эту информацию где-то использовать... S>А для чего вам это и как вы собираетесь ее использовать? Можете поподробнее? Z>Да так, ничего интересного...Просто лабу делаю..Вообще то задание было проще, просто интересно стало.. Хочу полученную инфомацию о mfc классах вывести в CTreeCtrl в виде дерева..
В MFC есть классы, не унаследованные ни от кого. Типа CRect. К какому месту дерева будете их приклеивать? Но это так, к слову.
Z>Это же просто(просто я не знаю),
С чего вы взяли, что просто? Насколько я знаю, в MFC нету места, где бы информация о классах центализованно лежала, откуда можно было бы просто взять и дерево заполнить.
Z>неужели никто не поможет:
Вполне может быть, что никто и не поможет...
Z>не сам же я буду делать
Коли взялся за гуж...
Вы же сказали, что задание изначально было не такое. Вот к начальному заданию и вернитесь, может оно попроще
Z>...Буду ждать.Обещаю высокие отметки. подумайте — деловое предложение...
"Буду ждать" — это несерьезно. Нужно так — вы делаете потихоньку, нас в известность о прогрессе ставите, рассказываете, где споткнулсь, мы вам помогаем потихоньку.
Если хотите дождаться работающего кода, то вполне возможно, что и не дождетесь.
Могу дать первую подсказку (это шаг, который предпринял бы я сам): при сериализации объекта из потока читается имя класса объекта. Затем MFC находит каким-то образом RuntimeClass для данного имени класса и создает объект класса (Само собой, если имени не находится, сериализация заканчиватся досрочно с ошибкой). Иными словами, MFC пробегает по где-то хранящемуся списку имен классов и делает сравнение строк. Вот и посмотрите, как MFC это делает. Может, тот код наведет вас на мысль, как это сделать.
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[4]: иерархия классов mfc
От:
Аноним
Дата:
15.04.03 08:45
Оценка:
Здравствуйте, Serguei666, Вы писали:
S>Здравствуйте, Zergulius, Вы писали:
Z>Здравствуйте, Serguei666, Вы писали:
S>Здравствуйте, Zergulius, Вы писали:
Z>Привет! Если кто-то знает — помогите. Мне нужно получить всю иерархию классов MFC, то есть как бы обойти всё дерево, чтобы в дальнейшем эту информацию где-то использовать... S>А для чего вам это и как вы собираетесь ее использовать? Можете поподробнее? Z>Да так, ничего интересного...Просто лабу делаю..Вообще то задание было проще, просто интересно стало.. Хочу полученную инфомацию о mfc классах вывести в CTreeCtrl в виде дерева.. S>В MFC есть классы, не унаследованные ни от кого. Типа CRect. К какому месту дерева будете их приклеивать? Но это так, к слову.
Z>Это же просто(просто я не знаю), S>С чего вы взяли, что просто? Насколько я знаю, в MFC нету места, где бы информация о классах центализованно лежала, откуда можно было бы просто взять и дерево заполнить.
Z>неужели никто не поможет: S>Вполне может быть, что никто и не поможет...
Z>не сам же я буду делать S>Коли взялся за гуж... S>Вы же сказали, что задание изначально было не такое. Вот к начальному заданию и вернитесь, может оно попроще
Z>...Буду ждать.Обещаю высокие отметки. подумайте — деловое предложение... S>"Буду ждать" — это несерьезно. Нужно так — вы делаете потихоньку, нас в известность о прогрессе ставите, рассказываете, где споткнулсь, мы вам помогаем потихоньку. S>Если хотите дождаться работающего кода, то вполне возможно, что и не дождетесь.
S>Могу дать первую подсказку (это шаг, который предпринял бы я сам): при сериализации объекта из потока читается имя класса объекта. Затем MFC находит каким-то образом RuntimeClass для данного имени класса и создает объект класса (Само собой, если имени не находится, сериализация заканчиватся досрочно с ошибкой). Иными словами, MFC пробегает по где-то хранящемуся списку имен классов и делает сравнение строк. Вот и посмотрите, как MFC это делает. Может, тот код наведет вас на мысль, как это сделать.
Спасибо за подсказку. Нашёл я этот код в arccore.cpp
#pragma code_seg(AFX_CORE2_SEG)
// search app specific classes
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
AfxLockGlobals(CRIT_RUNTIMECLASSLIST);
for (pClass = pModuleState->m_classList; pClass != NULL;
pClass = pClass->m_pNextClass)
{
if (lstrcmpA(szClassName, pClass->m_lpszClassName) == 0)
{
AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
return pClass;
}
}
AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
при поиске in shared DLLs список заполняется Runtimeclassami, но далеко не всеми
Re[5]: иерархия классов mfc
От:
Аноним
Дата:
15.04.03 14:57
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Serguei666, Вы писали:
S>Здравствуйте, Zergulius, Вы писали:
Z>Здравствуйте, Serguei666, Вы писали:
S>Здравствуйте, Zergulius, Вы писали:
Z>Привет! Если кто-то знает — помогите. Мне нужно получить всю иерархию классов MFC, то есть как бы обойти всё дерево, чтобы в дальнейшем эту информацию где-то использовать... S>А для чего вам это и как вы собираетесь ее использовать? Можете поподробнее? Z>Да так, ничего интересного...Просто лабу делаю..Вообще то задание было проще, просто интересно стало.. Хочу полученную инфомацию о mfc классах вывести в CTreeCtrl в виде дерева.. S>В MFC есть классы, не унаследованные ни от кого. Типа CRect. К какому месту дерева будете их приклеивать? Но это так, к слову.
Z>Это же просто(просто я не знаю), S>С чего вы взяли, что просто? Насколько я знаю, в MFC нету места, где бы информация о классах центализованно лежала, откуда можно было бы просто взять и дерево заполнить.
Z>неужели никто не поможет: S>Вполне может быть, что никто и не поможет...
Z>не сам же я буду делать S>Коли взялся за гуж... S>Вы же сказали, что задание изначально было не такое. Вот к начальному заданию и вернитесь, может оно попроще
Z>...Буду ждать.Обещаю высокие отметки. подумайте — деловое предложение... S>"Буду ждать" — это несерьезно. Нужно так — вы делаете потихоньку, нас в известность о прогрессе ставите, рассказываете, где споткнулсь, мы вам помогаем потихоньку. S>Если хотите дождаться работающего кода, то вполне возможно, что и не дождетесь.
S>Могу дать первую подсказку (это шаг, который предпринял бы я сам): при сериализации объекта из потока читается имя класса объекта. Затем MFC находит каким-то образом RuntimeClass для данного имени класса и создает объект класса (Само собой, если имени не находится, сериализация заканчиватся досрочно с ошибкой). Иными словами, MFC пробегает по где-то хранящемуся списку имен классов и делает сравнение строк. Вот и посмотрите, как MFC это делает. Может, тот код наведет вас на мысль, как это сделать.
А>Спасибо за подсказку. Нашёл я этот код в arccore.cpp А>#pragma code_seg(AFX_CORE2_SEG) А>// search app specific classes А> AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); А> AfxLockGlobals(CRIT_RUNTIMECLASSLIST); А> for (pClass = pModuleState->m_classList; pClass != NULL; А> pClass = pClass->m_pNextClass) А> { А> if (lstrcmpA(szClassName, pClass->m_lpszClassName) == 0) А> { А> AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST); А> return pClass; А> } А> } А> AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
А> // search classes in shared DLLs А> AfxLockGlobals(CRIT_DYNLINKLIST); А> for (CDynLinkLibrary* pDLL = pModuleState->m_libraryList; pDLL != NULL; А> pDLL = pDLL->m_pNextDLL) А> { А> for (pClass = pDLL->m_classList; pClass != NULL; А> pClass = pClass->m_pNextClass) А> { А> if (lstrcmpA(szClassName, pClass->m_lpszClassName) == 0) А> { А> AfxUnlockGlobals(CRIT_DYNLINKLIST); А> return pClass; А> } А> } А> } А> AfxUnlockGlobals(CRIT_DYNLINKLIST);
А>при поиске in shared DLLs список заполняется Runtimeclassami, но далеко не всеми
Вы нашли правильное место.
Теперь осталось выяснить, 1) что за классы в списке pDLL->m_classList, 2) как они туда попадают и 3) почему они там не все.
Переменная pClass имеет тип CRuntimeClass. В общем, этот факт помогает ответить на 1-ый вопрос и догадатся об ответах на вопросы 2 и 3.
Итак:
1) В списке находятся указатели на CRuntimeClass структуры
Ответы на вопросы 2 и 3 имеют силу предположения, т.е. я не уверен, что все именно так на 100%
2) CRuntimeClass структура при создании самой себя регистрирует себя в списке
3) Очевидно, что в списке только те классы, которые имеют CRuntimeClass структуры
Вывод: вы можете, используя данный список, составить иерархию классов MFC, но только тех, которые имеют CRuntimeClass структуры.
Альтернативного решения по нахождению списка классов MFC я не могу предложить, ибо не знаю. Вполне возможно, что простого решения этой задачи нет. Конечно, можно попытатся открыть MFC LIB и прочитать оттуда все, но это однозначно не простое решение и помочь вам в этом я тоже не смогу.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Serguei666, Вы писали:
S>Здравствуйте, Zergulius, Вы писали:
Z>Здравствуйте, Serguei666, Вы писали:
S>Здравствуйте, Zergulius, Вы писали:
Z>Привет! Если кто-то знает — помогите. Мне нужно получить всю иерархию классов MFC, то есть как бы обойти всё дерево, чтобы в дальнейшем эту информацию где-то использовать... S>А для чего вам это и как вы собираетесь ее использовать? Можете поподробнее? Z>Да так, ничего интересного...Просто лабу делаю..Вообще то задание было проще, просто интересно стало.. Хочу полученную инфомацию о mfc классах вывести в CTreeCtrl в виде дерева.. S>В MFC есть классы, не унаследованные ни от кого. Типа CRect. К какому месту дерева будете их приклеивать? Но это так, к слову.
Z>Это же просто(просто я не знаю), S>С чего вы взяли, что просто? Насколько я знаю, в MFC нету места, где бы информация о классах центализованно лежала, откуда можно было бы просто взять и дерево заполнить.
Z>неужели никто не поможет: S>Вполне может быть, что никто и не поможет...
Z>не сам же я буду делать S>Коли взялся за гуж... S>Вы же сказали, что задание изначально было не такое. Вот к начальному заданию и вернитесь, может оно попроще
Z>...Буду ждать.Обещаю высокие отметки. подумайте — деловое предложение... S>"Буду ждать" — это несерьезно. Нужно так — вы делаете потихоньку, нас в известность о прогрессе ставите, рассказываете, где споткнулсь, мы вам помогаем потихоньку. S>Если хотите дождаться работающего кода, то вполне возможно, что и не дождетесь.
S>Могу дать первую подсказку (это шаг, который предпринял бы я сам): при сериализации объекта из потока читается имя класса объекта. Затем MFC находит каким-то образом RuntimeClass для данного имени класса и создает объект класса (Само собой, если имени не находится, сериализация заканчиватся досрочно с ошибкой). Иными словами, MFC пробегает по где-то хранящемуся списку имен классов и делает сравнение строк. Вот и посмотрите, как MFC это делает. Может, тот код наведет вас на мысль, как это сделать.
А>Спасибо за подсказку. Нашёл я этот код в arccore.cpp А>#pragma code_seg(AFX_CORE2_SEG) А>// search app specific classes А> AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); А> AfxLockGlobals(CRIT_RUNTIMECLASSLIST); А> for (pClass = pModuleState->m_classList; pClass != NULL; А> pClass = pClass->m_pNextClass) А> { А> if (lstrcmpA(szClassName, pClass->m_lpszClassName) == 0) А> { А> AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST); А> return pClass; А> } А> } А> AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
А> // search classes in shared DLLs А> AfxLockGlobals(CRIT_DYNLINKLIST); А> for (CDynLinkLibrary* pDLL = pModuleState->m_libraryList; pDLL != NULL; А> pDLL = pDLL->m_pNextDLL) А> { А> for (pClass = pDLL->m_classList; pClass != NULL; А> pClass = pClass->m_pNextClass) А> { А> if (lstrcmpA(szClassName, pClass->m_lpszClassName) == 0) А> { А> AfxUnlockGlobals(CRIT_DYNLINKLIST); А> return pClass; А> } А> } А> } А> AfxUnlockGlobals(CRIT_DYNLINKLIST);
А>при поиске in shared DLLs список заполняется Runtimeclassami, но далеко не всеми А>Вы нашли правильное место. А>Теперь осталось выяснить, 1) что за классы в списке pDLL->m_classList, 2) как они туда попадают и 3) почему они там не все. А>Переменная pClass имеет тип CRuntimeClass. В общем, этот факт помогает ответить на 1-ый вопрос и догадатся об ответах на вопросы 2 и 3. А>Итак: А>1) В списке находятся указатели на CRuntimeClass структуры А>Ответы на вопросы 2 и 3 имеют силу предположения, т.е. я не уверен, что все именно так на 100% А>2) CRuntimeClass структура при создании самой себя регистрирует себя в списке А>3) Очевидно, что в списке только те классы, которые имеют CRuntimeClass структуры
А>Вывод: вы можете, используя данный список, составить иерархию классов MFC, но только тех, которые имеют CRuntimeClass структуры.
..in my имхо ..
В этот список попадают CRuntimeClassы только прилинкованых к модулю приложения классов, остальные RunTimы подгружаются из mfcXX.dll,то есть состояние моего модуля приложения не может содержать списка с runtimами mfc,то есть мне надо слинковать моё приложение с mfc в один модуль...Как..?пробовал #pragma comment(lib,"mfc42d.lib")-не работает(результат аналогичен), если #pragma comment(lib,"mfc42.lib")-accsess violation...Кстати я думаю, что runtimы, которые всё-таки попали в список,используются для создания объектов,используемых для поиска других рантаймов в какой-то хэш таблице...sorry за ошибочное мнение..
Dump of all classes:
CDockState
CMapWordToOb
CMapStringToString
CMapStringToOb
CStringList
CObList
CWordArray
CStringArray
CObArray
CDWordArray
CByteArray
А>Альтернативного решения по нахождению списка классов MFC я не могу предложить, ибо не знаю. Вполне возможно, что простого решения этой задачи нет. Конечно, можно попытатся открыть MFC LIB и прочитать оттуда все, но это однозначно не простое решение и помочь вам в этом я тоже не смогу.
Здравствуйте, Zergulius, Вы писали:
А>Вывод: вы можете, используя данный список, составить иерархию классов MFC, но только тех, которые имеют CRuntimeClass структуры. Z>..in my имхо .. Z>В этот список попадают CRuntimeClassы только прилинкованых к модулю приложения классов, остальные RunTimы подгружаются из mfcXX.dll,то есть состояние моего модуля приложения не может содержать списка с runtimами mfc,то есть мне надо слинковать моё приложение с mfc в один модуль...
Не понял, зачем нужно линковать "приложение с mfc в один модуль". Вы что, хотите прилинковать MFC статически? И что это изменит?
Почему нельзя просто найти MFCшный модуль и пробежатся по нему? Как, по-вашему, не переопределенные MFC-классы серализуются?
Z>Как..?пробовал #pragma comment(lib,"mfc42d.lib")-не работает(результат аналогичен), если #pragma comment(lib,"mfc42.lib")-accsess violation...
Не надо pragmой злоупотреблять. Идите в Project Settings диалог, "General" Tab, выберите "Use MFC in a static library" в первом комбо боксе.
Z>Кстати я думаю, что runtimы, которые всё-таки попали в список,используются для создания объектов,используемых для поиска других рантаймов в какой-то хэш таблице...sorry за ошибочное мнение..
Не надо извинятся. Бывает.
То, что вы сказали, действительно ошибочное мнение.
Я вам ранее написал — "3) Очевидно, что в списке только те классы, которые имеют CRuntimeClass структуры". Это немного неточно, как я теперь вижу. Думаю, правилнее будет так: "Очевидно, что в списке только те классы, которые имеют СЕРИАЛИЗУЕМЫЕ CRuntimeClass структуры"
Теперь идете запускаете поиск IMPLEMENT_SERIAL по исходникам MFC и находите только вот такие строки:
Это и есть список классов, которые вы можете выудить из m_classList.
Не густо.
Очевидно, это все, на что способен данный метод поиска RuntimeClassов.
Как видите, все логично. Несериализуемые классы (а таких в MFC, как видите, большинство) не регистрируют себя в списке.
Z>Dump of all classes: Z> CDockState Z> CMapWordToOb Z> CMapStringToString Z> CMapStringToOb Z> CStringList Z> CObList Z> CWordArray Z> CStringArray Z> CObArray Z> CDWordArray Z> CByteArray
Теперь дальше. Попробуйте посмотреть на CRuntimeClass исходники и определить, регистрирует ли себя CRuntimeClass объект еще где-нибудь. Может, есть еще какой-нибудь список.