powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как найти handle модуля
46 сообщений из 46, показаны все 2 страниц
Как найти handle модуля
    #39462952
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это продолжение этой темы Как найти имя модуля
Там не точно описана проблема и полемика ушла в бок и в треп.
--------
Среда - C++Builder 6.0 (BCB)

Есть BPL (например MyBpl), инсталлирована в BCB.
В BPL есть базовая форма TForm (например TForm::TMyForm) и унаследованные
от MyForm (например TMyForm::TMyFormChild,TMyFormChild:TMyFormGrandChild и т.д.)

Есть несколько DLL (числом 26 штук (пока), например, MyDll1, MyDll2), которые
в своем функционале создают экземпляры наследников TMyForm вызовом конструктора
создаваемого экземпляра. Число экземпляров наследников не подлежит подсчету, а
порядок - единицы сотен в каждой DLL.

Каждый создаваемый экземпляр должен знать handle DLL из которой создан для
удовлетворения "хотелки" заказчика.

Проблема в том, что передача handle из DLL-ки через параметр конструктора или
в member только что созданного экземпляра неприемлемо и не обсуждаемо .
DLL трогать нельзя.

Конструктор должен "сам внутри себя раскопать" handle через API, экспортируемые
функции ядра, через что угодно. "Раскапывание" может быть в форме (лучше базовой)
или в BPL, где живут цепочка унаследованных форм.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463040
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pupkin, смотрю, ты таки жаждишь "одеть штаны через голову"... :)
Чтож... Тогда в конструкторе MyForm на стеке резервируй блок памяти через alloca, по полученному указателю ищи вверх по стеку точку возврата и через PSAPI определяй какому модулю DLL этот адрес принадлежит. Вместо alloca можно попробовать объявить внутри конструктора на стеке volatile void* = NULL и получить на него указатель через оператор &.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463051
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pupkin, и не забудь директиву выравнивания, если будешь определять внутри конструктора volatile void*
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463067
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GetHandle по имени возвращает HANDLE на DLL-ку, если она загружена. Иначе nullptr. При этом не надо делать потом FreeLibrary!
Предыдущую ветку не читал.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463106
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb, у него GetHandle вернет handle на BPL, а не на DLL.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463135
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devPupkin, смотрю, ты таки жаждишь "одеть штаны через голову"... :)
Чтож... Жаждю !!!

А нельзя ли поподробней. Не про штаны, а про второе...
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463139
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pupkinrdb_devPupkin, смотрю, ты таки жаждишь "одеть штаны через голову"... :)
Чтож... Жаждю !!!

А нельзя ли поподробней. Не про штаны, а про второе...

Да фигня это всё, тщетные попытки спеть басом...
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463145
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinЕсть несколько DLL (числом 26 штук (пока), например, MyDll1, MyDll2), которые
в своем функционале создают экземпляры наследников TMyForm вызовом конструктора
создаваемого экземпляра. Число экземпляров наследников не подлежит подсчету, а
порядок - единицы сотен в каждой DLL.

Каждый создаваемый экземпляр должен знать handle DLL из которой создан для
удовлетворения "хотелки" заказчика.

Проблема в том, что передача handle из DLL-ки через параметр конструктора или
в member только что созданного экземпляра неприемлемо и не обсуждаемо .
DLL трогать нельзя.А в чем проблема то? Так заказчику и говоришь: объем работы очень большой, делать не возьмусь ну за какие деньги. Ну или как вариант: это будет стоить вам $100000.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463174
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devCEMb, у него GetHandle вернет handle на BPL, а не на DLL.
Нет, всё верно он написал. Эта функция вернёт хэндл указанного модуля, если он загружен конечно
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463187
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)rdb_devCEMb, у него GetHandle вернет handle на BPL, а не на DLL.
Нет, всё верно он написал. Эта функция вернёт хэндл указанного модуля, если он загружен конечно
Как я понял ТСу надо узнать то самое lpModuleName. Т.е. он хочешь узнать хэндл, а по нему определить lpModuleName.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463189
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)rdb_devCEMb, у него GetHandle вернет handle на BPL, а не на DLL.
Нет, всё верно он написал. Эта функция вернёт хэндл указанного модуля, если он загружен конечноВозвращаемся к первой серии: а как найти имя?
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463214
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonekealon(Ruslan)пропущено...

Нет, всё верно он написал. Эта функция вернёт хэндл указанного модуля, если он загружен конечноВозвращаемся к первой серии: а как найти имя?
ну скажем так, у него довольно странная модель плагинов в вакууме
при такой постановке здачи, в общем виде это сделать нельзя, наследуемая форма вообще может не иметь ни одного вызова кода из DLL

тут ванговать бесполезно, нужно знать как создаётся форма, как регистрируется плагин и пр.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463221
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя нет, туплю уже в середине недели

можно, адресс VMT текущего класса находится в константной секции DLL
дальше искать dll содержащую этот адрес с помощью TlHelp32
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463455
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите, что вверг вас в рекурсию.
+1 за TlHelp32
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463506
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)хотя нет, туплю уже в середине недели

можно, адресс VMT текущего класса находится в константной секции DLL
дальше искать dll содержащую этот адрес с помощью TlHelp32
если класс не переопределяет виртуальных методов - оптимизатор часом не воспользуется родительской VMT(если RTTI отключён)?
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463515
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BarlonePupkinЕсть несколько DLL (числом 26 штук (пока), например, MyDll1, MyDll2), которые
в своем функционале создают экземпляры наследников TMyForm вызовом конструктора
создаваемого экземпляра. Число экземпляров наследников не подлежит подсчету, а
порядок - единицы сотен в каждой DLL.

Каждый создаваемый экземпляр должен знать handle DLL из которой создан для
удовлетворения "хотелки" заказчика.

Проблема в том, что передача handle из DLL-ки через параметр конструктора или
в member только что созданного экземпляра неприемлемо и не обсуждаемо .
DLL трогать нельзя.А в чем проблема то? Так заказчику и говоришь: объем работы очень большой, делать не возьмусь ну за какие деньги. Ну или как вариант: это будет стоить вам $100000.Не обсуждаемо !!!
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463518
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилkealon(Ruslan)хотя нет, туплю уже в середине недели

можно, адресс VMT текущего класса находится в константной секции DLL
дальше искать dll содержащую этот адрес с помощью TlHelp32
если класс не переопределяет виртуальных методов - оптимизатор часом не воспользуется родительской VMT(если RTTI отключён)?
VMT-блок так же содержит имя класса, ссылку на родительский блок, так что для каждого класса взятого линкёром она обязательно есть. Информаци о полях тут не важна

Код: pascal
1.
class function ClassInfo: Pointer


вовращаемый ей адресс и нужно искать в диапазонах загрузки билиотек
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463521
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinНе обсуждаемо !!!Если я всё правильно понял, то: если код DLL-ки создал форму, будучи вызванным в, например, основном потоке, то она (форма) ничем топологически отличаться не будет от формы, созданной самим приложением. Если же это другой поток, например хук с внедрением, то можно по адресу расположения данных понять, какому потоку/DLL-ке принадлежит объект. А, даже есть уже готовая функция: GetWindowThreadProcessId, которая по хендлу окна скажет, в каком потоке оно создано.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463522
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)вовращаемый ей адресс и нужно искать в диапазонах загрузки билиотекя сначала тоже хотел это написать, но потом засомневался: диапазон загрузки библиотеки относится вроде только к исполняемому коду? Данные по созданной форме будут лежать где-то на стеке, и понять по ним/адресу ничего не получится. Но вот я не знаю, где лежать статические данные динамически загружаемых библиотек? Это так, просто интересно... проблему автора это не решает.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463531
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кривой костыль, но как вариант: HMODULE это адрес проецирования содержимого DLL в адресное пространство процесса.
Поэтому берем адрес какого-нибудь виртуального метода, о котором заведомо известно что он прописан внутри DLL и перебором ищем наибольший HMODULE меньше этого адреса.

Может кроме виртуальных методов можно еще что-то использовать, главное чтобы это что-то располагалось в коде искомой DLL и было связано с нужным объектом.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463540
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbА, даже есть уже готовая функция: GetWindowThreadProcessId, которая по хендлу окна скажет, в каком потоке оно создано.
а поток то здесь при чём?
срочно выдохни
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463592
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinА нельзя ли поподробней. Не про штаны, а про второе...Можно!
Некоторые, конечно, могут назвать это грязным хаком, но делается это, примерно, так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
__fastcall TForm1::TForm1(TComponent* Owner)  : TForm(Owner)
{
  volatile size_t ret_address;
  asm
  {
    mov eax, dword ptr [ebp+0x4]; // +0x4 - skip previous EBP value
    mov [ret_address], eax;       // eax = next EIP value after ret
  }
  // Далее на примере, по ссылки ниже, определяешь с какого модуля пришел invoke
}

MSDN::Traversing the Module List

Модератор: rdb_dev, Проверь, правильно ли я исправил код
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39463728
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbkealon(Ruslan)вовращаемый ей адресс и нужно искать в диапазонах загрузки билиотекя сначала тоже хотел это написать, но потом засомневался: диапазон загрузки библиотеки относится вроде только к исполняемому коду? Данные по созданной форме будут лежать где-то на стеке, и понять по ним/адресу ничего не получится. Но вот я не знаю, где лежать статические данные динамически загружаемых библиотек? Это так, просто интересно... проблему автора это не решает.
нет, куда ещё по твоему константы должны идти?


CEMbPupkinНе обсуждаемо !!!Если я всё правильно понял, то: если код DLL-ки создал форму, будучи вызванным в, например, основном потоке, то она (форма) ничем топологически отличаться не будет от формы, созданной самим приложением. Если же это другой поток, например хук с внедрением, то можно по адресу расположения данных понять, какому потоку/DLL-ке принадлежит объект. А, даже есть уже готовая функция: GetWindowThreadProcessId, которая по хендлу окна скажет, в каком потоке оно создано.
смотри, вот тебе готовое решение

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
program D1;
 {$APPTYPE CONSOLE}

uses
  Winapi.Windows, Winapi.Messages, Winapi.ImageHlp, Winapi.TlHelp32,
  Vcl.Forms,

  Unit1 in 'Unit1.pas' {Form2};
procedure WriteLibOfAddr(P: Pointer);
var
  h: THandle;
  me: TModuleEntry32;
  a, b, c : UIntPtr;
begin
  // Get the list of modules in this process
  h := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,GetCurrentProcessId());
  if (h = INVALID_HANDLE_VALUE) then
    Exit;
  try
    FillChar(me, SizeOf(me), 0);
    me.dwSize := sizeof(me);

    c := UIntPtr(P);
    if Module32First(h, me) then
      repeat
        a := UIntPtr(me.modBaseAddr);
        b := UIntPtr(me.modBaseAddr) + UIntPtr(me.modBaseSize);
        if (a <= c) and ( c < b) then
        begin
          Writeln(me.szExePath);
        end;
      until not Module32Next(h, me);
  finally
    CloseHandle(h);
  end;
 end;

{$R *.res}

begin
  WriteLibOfAddr(TForm.ClassInfo);
  WriteLibOfAddr(TForm2.ClassInfo);

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.



вывод:
Код: plaintext
1.
C:\Program Files (x86)\Embarcadero\RAD Studio\9.0\bin\vcl160.bpl
C:\Users\kealo\Documents\RAD Studio\Projects\Win32\Debug\D1.exe
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464097
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devPupkinА нельзя ли поподробней. Не про штаны, а про второе...Можно!
Некоторые, конечно, могут назвать это грязным хаком, но делается это, примерно, так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
__fastcall TForm1::TForm1(TComponent* Owner)  : TForm(Owner)
{
  volatile size_t ret_address;
  asm
  {
    mov eax, dword ptr [ebp+0x4]; // +0x4 - skip previous EBP value
    mov [ret_address], eax;       // eax = next EIP value after ret
  }
  // Далее на примере, по ссылки ниже, определяешь с какого модуля пришел invoke
}

MSDN::Traversing the Module List

Модератор: rdb_dev, Проверь, правильно ли я исправил код
А потом при сборке в релиз отключается stack frames, и всё падает...
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464099
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКривой костыль, но как вариант: HMODULE это адрес проецирования содержимого DLL в адресное пространство процесса.
Поэтому берем адрес какого-нибудь виртуального метода, о котором заведомо известно что он прописан внутри DLL и перебором ищем наибольший HMODULE меньше этого адреса.

Может кроме виртуальных методов можно еще что-то использовать, главное чтобы это что-то располагалось в коде искомой DLL и было связано с нужным объектом.А вы уверены, что модуль, в котором описан класс, и модуль, в котором вызывается конструктор - один и тот же?
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464102
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDima TКривой костыль, но как вариант: HMODULE это адрес проецирования содержимого DLL в адресное пространство процесса.
Поэтому берем адрес какого-нибудь виртуального метода, о котором заведомо известно что он прописан внутри DLL и перебором ищем наибольший HMODULE меньше этого адреса.

Может кроме виртуальных методов можно еще что-то использовать, главное чтобы это что-то располагалось в коде искомой DLL и было связано с нужным объектом.А вы уверены, что модуль, в котором описан класс, и модуль, в котором вызывается конструктор - один и тот же?
Тут главное быть уверенным что есть что-то связанное с нужным классом, что гарантированно располагается внутри DLL и есть возможность получить адрес в памяти этого что-то.
kealon(Ruslan) эту тему развил 20530770 и вроде как даже работает.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464103
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devНекоторые, конечно, могут назвать это грязным хаком, но делается это, примерно, так:
А, и еще... Если написать это в конструкторе базового класса, в адресе возврата будет будет конструктор ближайшего потомка... А это ли надо автору?
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464108
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По крайней мере, вот из этого
PupkinЕсть BPL (например MyBpl), инсталлирована в BCB.
В BPL есть базовая форма TForm (например TForm::TMyForm) и унаследованные
от MyForm (например TMyForm::TMyFormChild,TMyFormChild:TMyFormGrandChild и т.д.)
создается впечатление, что все наследники описаны в одном .bpl, а узнать хочется хендл модуля, где вызов new
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464210
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропила поток то здесь при чём?
срочно выдохнине буду. Поток тут при том, что, по моему мнению, это единственный случай, когда можно определить, какой либой создан объект, без использования дополнительных приседаний.

kealon(Ruslan)CEMbя сначала тоже хотел это написать, но потом засомневался: диапазон загрузки библиотеки относится вроде только к исполняемому коду?нет, куда ещё по твоему константы должны идти?Константы проблему автора вроде не решают, для решения нужна динамическая память
kealon(Ruslan)смотри, вот тебе готовое решениеа нет, решает, но почему ClassInfo в данном случае - константа? И... и у меня ещё подозрение, что если форму этого класса создать в коде другой библиотеки, то адрес ClassInfo останется прежним? Если нет, то почему?
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464251
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbkealon(Ruslan)смотри, вот тебе готовое решениеа нет, решает, но почему ClassInfo в данном случае - константа? И... и у меня ещё подозрение, что если форму этого класса создать в коде другой библиотеки, то адрес ClassInfo останется прежним? Если нет, то почему?
ClassInfo это арес VMT-блока в той либе где объявлен класс, автору надо бы точнее формулировать

PupkinКаждый создаваемый экземпляр должен знать handle DLL из которой создан для
удовлетворения "хотелки" заказчика.
это можно понять двояко

ждёмс автора
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464279
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneА вы уверены, что модуль, в котором описан класс, и модуль, в котором вызывается конструктор - один и тот же?Для "Borland C++ Builder 6" уверен. Отключение дополнительных инструкций формирования кадра стека для обеспечения отладки никак не влияет на основную часть соглашение вызова fastcall. Указатель на предшествующую перед вызовом вершину стека и адрес возврата всё равно будут сохранены в стеке.
Поведение легко проверить - достаточно создать по шаблону маленький проект с одной формой, добавить в конструктор указанный фрагмент кода, переключить компиляцию проекта из Debug в Release, убедиться, что отключен StackFrames, собрать проект и декомпилировать в ассемблер. Для такой простой затеи вполне подойдет дизассембер, имеющийся в удобном инструменте просмотра PE заголовков CFF Explorer . Правда, есть один нюанс - fastcall не стандартизирован и его поведение может меняться. Если кого-то не устраивает эта ситуация, можно использовать stdcall.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464282
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneА, и еще... Если написать это в конструкторе базового класса, в адресе возврата будет будет конструктор ближайшего потомка... А это ли надо автору?Похоже, что именно это ему и надо - точка возврата в конструктор потомка, реализованного в DLL.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464355
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ставки на топикстартера будем делать (получится у него или нет)?
Можно там по 1000 рублей, или на пиво...
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464402
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, проверь почту - письмо с темой о пиве.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464499
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devBarloneА, и еще... Если написать это в конструкторе базового класса, в адресе возврата будет будет конструктор ближайшего потомка... А это ли надо автору?Похоже, что именно это ему и надо - точка возврата в конструктор потомка, реализованного в DLL.Ну не знаю, я перечитываю первое сообщение в этой теме, и в предыдущей теме - и мне кажется, что у него все формы объявлены в одном .bpl, а создаются в разных .dll
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464505
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так что адрес vmt - не вариант, он не в том модуле будет. И ближайший кадр стека - тоже мимо. Надо раскручивать стек до адреса в .dll
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464514
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneНу не знаю, я перечитываю первое сообщение в этой теме, и в предыдущей теме - и мне кажется, что у него все формы объявлены в одном .bpl, а создаются в разных .dllНа сколько я понял, BPL он менять может, а DLL нет. Поэтому, зарядить фрагмент кода во всех наследников, реализованных в BPL, ему не составит большого труда.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464524
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, уже проходили... "Решение не устраивает из-за немеряного числа наследников"
20520800
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464531
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneТак что адрес vmt - не вариант, он не в том модуле будет. И ближайший кадр стека - тоже мимо. Надо раскручивать стек до адреса в .dllНе вижу большой проблемы... Какой-нибудь из конструкторов да получит адрес возврата в DLL.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464537
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone, он ранее писал, что в BPL у него только MyForm, а всё остальное в DLL, которые он первое - не может менять, второе - наследников в DLL, типа, очень много.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464567
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перечитал, действительно непонятно что ищем: имя DLL где прописана форма-наследник или DLL из которой был вызов new для создания формы. Я подумал про первое.

ИМХО Во-втором случае только стэк разматывать в конструкторе TMyForm.
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464612
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПеречитал, действительно непонятно что ищем: имя DLL где прописана форма-наследник или DLL из которой был вызов new для создания формы. Я подумал про первое.

ИМХО Во-втором случае только стэк разматывать в конструкторе TMyForm.
я тоже думал что первое, для второго случае можно проще ну его конструктор разматывать
в TObject есть две виртуальные функции, которые всегда вызываются

class function NewInstance: TObject; virtual; - до вызова конструктора, собственно она и выделяет память
procedure AfterConstruction; virtual; - после вызова конструктора

вторая хуже, её часто переопределяют, а вот первая, вполне - там стэк небольшой будет
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464939
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devBarlone, он ранее писал, что в BPL у него только MyForm, а всё остальное в DLL, которые он первое - не может менять, второе - наследников в DLL, типа, очень много.Где он такое писал? Я вижу:

"Есть BPL (например MyBpl), инсталлирована в BCB. В BPL есть форма TForm (например TForm::MyForm)" 20492969

"Мне нужно предложить решение (или путь к оному) как узнать имя DLL (которых не одна) из формы, которая "живет" в BPL, и создается в DLL методом new." 20510445

"В BPL есть базовая форма TForm (например TForm::TMyForm) и унаследованные от MyForm (например TMyForm::TMyFormChild,TMyFormChild:TMyFormGrandChild и т.д.)" 20526556
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39464952
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbИзопропила поток то здесь при чём?
срочно выдохнине буду. Поток тут при том, что, по моему мнению, это единственный случай, когда можно определить, какой либой создан объект, без использования дополнительных приседаний.
ещё раз - какое отношение к задаче топикстартера имеют потоки?
вроде как поток в состоянии исполнить код из любой загруженной DLL
и из кучи(если для страниц установлен бит разрешения исполнения).
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39465361
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,
20520800
20522761
а началось всё здесь: 20492969
...
Рейтинг: 0 / 0
Как найти handle модуля
    #39465649
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилещё раз - какое отношение к задаче топикстартера имеют потоки?предположил, что объект, созданный в потоке, будет лежать в области памяти потока. Но:
вроде как поток в состоянии исполнить код из любой загруженной DLLкак и любая DLL может вызвать код из любого места. Поэтому вообще ничего определённо сказать по самому объекту нельзя.
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как найти handle модуля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]