Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать хендл модуля? 
:(
    Опции темы
HappyLife
Дата 16.4.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как узнать хендл модуля по компоненту?
То есть, мне нужно узнать, в каком модуле был создан объект, через один из главных интерфесов, которые наследуют все компоненты Бильдера TComponent, TWinControl, TObject ?
PM MAIL   Вверх
HappyLife
Дата 16.4.2007, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну или как узнать хендл модуля, по хендлу объекта?, Мне важно знать в какой ДЛЛ был создан объект, чтобы в последствии обратиться к этой самой длл, и взять нужную функцию.
PM MAIL   Вверх
Klin
Дата 16.4.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Немного не понял. Объект находится в программе или в DLL?


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
HappyLife
Дата 16.4.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



HappyLife, 
Объект где-то создается, и отображаеться в программе. Вот мне важно знать где он создан.
Насколько я знаю, все объекты храняться в Application->Components
Вот перебором, по всем объектам, мне важно знать, кто их создал.
Создаются они в одних из моих ДЛЛ.

Это сообщение отредактировал(а) HappyLife - 16.4.2007, 13:32
PM MAIL   Вверх
dumb
Дата 16.4.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



HappyLife, если я правильно понял вопрос, то без "своего" учета - никак.
PM MAIL   Вверх
Vyacheslav
Дата 16.4.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Вообще можно. 
Вот из моего проекта. Определял по адресу имя модуля(своего!!!), откуда пришел exception
Код

AnsiString __fastcall InfoParma::GetExceptionModule(void* a_Addr)
{
     MEMORY_BASIC_INFORMATION mbi;
     if ( a_Addr && VirtualQuery(a_Addr,&mbi,sizeof(mbi)) )
     {
         char Path[ MAX_PATH ];
         GetModuleFileName((HMODULE)mbi.AllocationBase,Path,sizeof(Path));
         return ExtractFileName(AnsiString(Path));
     }
     return *NullStr;
}


Добавлено через 5 минут и 7 секунд
И вот код окна, которое выдавало информацию по ошибке
Код

__fastcall TErrorDialog::TErrorDialog(TComponent* a_Owner, Exception* a_Exc,
                                       TObject* a_Object )
    : TForm(Owner)
{
    AutoSize = true;
    Image->Picture->Icon->Handle = LoadIcon(NULL,MAKEINTRESOURCE(IDI_HAND));
    SecondRow->Caption =  Format("операцию по адресу %p",ARRAYOFCONST((ExceptAddr())));
    Message->Lines->Text = a_Exc->Message;
    Type->Caption =  a_Exc->ClassName();
    Module->Caption = GetExceptionModule(ExceptAddr());
    File->Caption = ExtractFileName(__ThrowFileName());
    Line->Caption = __ThrowLineNumber();
    if  (a_Object)
    {
     Object->Caption =  a_Object->ClassName();
     if ( IsPublishedProp(a_Object, cName) )
         ObjectName->Caption = GetStrProp(a_Object, cName);
    }
    if (EADSDatabaseError* Error = dynamic_cast<EADSDatabaseError*>(a_Exc))
    {
        EADSDatabaseErrorSheet->TabVisible = Error;
        ACEErrorCode->Caption         =  Error->ACEErrorCode;
        DatabaseName->Caption         =  Error->DatabaseName;
        DatabasePath->Caption         =  Error->DatabasePath;
        DataSetInstanceName->Caption  =  Error->DataSetInstanceName;
        DataSetInstanceOwner->Caption =  Error->DataSetInstanceOwner;
        SQLErrorCode->Caption         =  Error->SQLErrorCode;
        TableName->Caption            =  Error->TableName;
    }
}
//---------------------------------------------------------------------------

void __fastcall TErrorDialog::DetailsBtnClick(TObject *Sender)
{
    DetailPageControl->Visible = !DetailPageControl->Visible;
    AutoSize = ! DetailPageControl->Visible;
    if (DetailPageControl->Visible)
    {
        Height = FormaHeight;
        DetailsBtn->Caption = cHide;
    }
    else
        DetailsBtn->Caption = cInDetail;
}
//---------------------------------------------------------------------------




Добавлено через 8 минут и 46 секунд
Хотя, судя по всему, это немного не то :(

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  except.jpg 23,39 Kb


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Klin
Дата 16.4.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Похоже, что если объект находится на собствееной форме, то отследить кто его создал не удастся :( Наверное, самый эфективный и простой метод это собственное слижение (т.е передача нужной информации об источнике с объектом). Хотя тоже накручено получается.  smile 


p.s. Vyacheslav, этот код определяет только адрес по имени?


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Vyacheslav
Дата 16.4.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Klin @  16.4.2007,  16:47 Найти цитируемый пост)
p.s. Vyacheslav, этот код определяет только адрес по имени? 

Это код определяет имя по адресу smile



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
HappyLife
Дата 17.4.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vyacheslav, Кхм, может быть это как раз то что мне нужно...
Но вот есть маленькая незадача. Если в качетсве параметра 
Код

for (int i =0; i < Application->ComponentCount; ++i)
{
MEMORY_BASIC_INFORMATION mbi;
                        if (VirtualQuery(Application->Components[i]->ClassName(),&mbi,sizeof(mbi)) )
                        {
                                char Path[ MAX_PATH ];
                                GetModuleFileName((HMODULE)mbi.AllocationBase,Path,sizeof(Path));
                                ShowMessage(ExtractFileName(AnsiString(Path)) + " " + Application->Components[i]->ClassName());
                        }

         }

например передать ClassName() он возратит, где этот самый метод находиться. А мне важно узнать, как определить где он создан.... Вот чтобы передать туда:((( Или преобразовать может быть как-нибудь...
PM MAIL   Вверх
Vyacheslav
Дата 17.4.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



А адрес компонента не пробовал передавать?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
HappyLife
Дата 17.4.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Бред какой-то иерогливовский получается.
Код

         for (int i =0; i < Application->ComponentCount; ++i)
         {
                        MEMORY_BASIC_INFORMATION mbi;
                        if (VirtualQuery(Application->Components[0],&mbi,sizeof(mbi)) )
                        {
                                char Path[ MAX_PATH ];
                                GetModuleFileName((HMODULE)mbi.AllocationBase,Path,sizeof(Path));
                                ShowMessage(ExtractFileName(AnsiString(Path)) + " " + Application->Components[i]->ClassName());
                        }

         }

PM MAIL   Вверх
dumb
Дата 17.4.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Цитата(Vyacheslav @  17.4.2007,  14:13 Найти цитируемый пост)
А адрес компонента не пробовал передавать?

Цитата(HappyLife @  17.4.2007,  14:47 Найти цитируемый пост)
Бред какой-то иерогливовский получается.

вполне логично - GetModuleFileName возвращает ошибку.
таким способом можно пользоваться только для кода или глоб.данных. память же под компоненты итд выделяется менеджером, и AllocationBase этой памяти не является правильным хэндлом для GetModuleFileName.

если доступны исходники всех библиотек, в которых создаются компоненты, то нужно каким-либо образом(напр. перегрузить new) приписывать хэндл модуля к выделяемому блоку памяти, либо заводить свой список (Object, hInstance).

если исходников нет, то можно глобально переназначить процедуры выделения памяти(F1:TMemoryManager), а там разгребать call-stack на предмет адресов с AllocationBase равным одному из hInstance dll'ей. найденный приписывать в начало блока.

а стоит овчинка выделки-то? smile
PM MAIL   Вверх
Klin
Дата 17.4.2007, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(dumb @  17.4.2007,  17:49 Найти цитируемый пост)
вполне логично - GetModuleFileName возвращает ошибку.

Странно, у меня без ошибки, только выдает название моего проекта (Project1.exe) :(


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
HappyLife
Дата 18.4.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dumb, суть в том, что я занимаюсь MultiLanguage для своего проекта.
И уж изначально, пошло, что для программы языки хранятся в одной папачке, а для модуля вместе с модулем. Вот и важно определить, где хранится файлик с текстом, для данной ДЛЛ.
Есть мысль поперепрошить в каждый ДЛЛ отдельный мультиязычный компонент, но это крайний случай.
Хотелось бы чтобы все можно было сделать из главного exe, или наоборот всю мультиязычность сделать в отдельной ДЛЛ.

Это сообщение отредактировал(а) HappyLife - 18.4.2007, 09:23
PM MAIL   Вверх
dumb
Дата 18.4.2007, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



эээ...
Код

HANDLE hDll = LoadLibrary("test.dll"); // динамика
//HANDLE hDll = GetModuleHandle("test.dll"); // статика
String LngName = ExtractFilePath(Application->ExeName) + "LANG\\lang.ini";
char DllName[1024];
if (GetModuleFileName(hDll, DllName, sizeof(DllName)))
{
  LngName = ExtractFilePath(DllName) + "lang.ini";
}


то же самое можно сделать и внутри каждой из библиотек, и экспортнуть функцию типа GetLangFile...
PM MAIL   Вверх
HappyLife
Дата 18.4.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dumb, Согласен. 
Хотелось, бы у самого компонента спросить, "где твой файлик с переводом".
Всем спасибо за помощь. Будем стараться. будем решать.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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