информационная безопасность
без паники и всерьез
 подробно о проекте
Портрет посетителяЗа кого нас держат?Атака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Модульный ботнет от русских хакеров 
 Торвальдс и вайбтестеры 
 Атака на GitHub 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Импорт класса из DLL 27.08.01 20:51  Число просмотров: 1000
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
> Есть чужая длл, которая экспортирует несколько функций
> некоторого класса, в том числе конструктор. Параметры
> вызова известны.
> Как в программе, которая грузит эту длл (LoadLibrary),
> создать объект этого класса и нормально с ним работать, то
> есть вызывать экспортируемые фкнкции этого класса?
> Хеадеров от длл-ки, естественно, нет.
>
> (Visual Studio 6, C++)

если класс простой, нет там чего-нибудь типа виртуальных функций, то можешь попробовать сам выделить побольше памяти (т.к. ты не знаешь размер класса); указатель на этот блок памяти и будет this; потом вызваешь явно конструктор для этого указателя (как функцию, первый аргумент которой - this, а остальные ты написал что знаешь)
наверно должно получиться :)
<programming>
[C++] Импорт класса из DLL 27.08.01 13:56  
Автор: Хунтер Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Есть чужая длл, которая экспортирует несколько функций некоторого класса, в том числе конструктор. Параметры вызова известны.
Как в программе, которая грузит эту длл (LoadLibrary), создать объект этого класса и нормально с ним работать, то есть вызывать экспортируемые фкнкции этого класса?
Хеадеров от длл-ки, естественно, нет.

(Visual Studio 6, C++)
[C++] Импорт класса из DLL 27.08.01 20:51  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
> Есть чужая длл, которая экспортирует несколько функций
> некоторого класса, в том числе конструктор. Параметры
> вызова известны.
> Как в программе, которая грузит эту длл (LoadLibrary),
> создать объект этого класса и нормально с ним работать, то
> есть вызывать экспортируемые фкнкции этого класса?
> Хеадеров от длл-ки, естественно, нет.
>
> (Visual Studio 6, C++)

если класс простой, нет там чего-нибудь типа виртуальных функций, то можешь попробовать сам выделить побольше памяти (т.к. ты не знаешь размер класса); указатель на этот блок памяти и будет this; потом вызваешь явно конструктор для этого указателя (как функцию, первый аргумент которой - this, а остальные ты написал что знаешь)
наверно должно получиться :)
[C++] Импорт класса из DLL 28.08.01 18:30  
Автор: Хунтер Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> если класс простой, нет там чего-нибудь типа виртуальных
> функций, то можешь попробовать сам выделить побольше памяти
> (т.к. ты не знаешь размер класса); указатель на этот блок
> памяти и будет this; потом вызваешь явно конструктор для
> этого указателя (как функцию, первый аргумент которой -
> this, а остальные ты написал что знаешь)
> наверно должно получиться :)

С delayload я обломался - VC упорно утверждал, что в этой длл-ке ничего нужного мне нет, поэтому грузить ее не будем, и параллено ругался на unresolved external symbols из моего класса. Я пытался объяснить ему, что это длл-импорт, но видимо не так, как нужно. Фиг с ним.

А вот с выделением памяти - правильная мысля. Если бы я не тормозил, то давно бы все получилось. 8-) Я выделял буфер и вызывал конструктор, полученный через GetProcAddress. Только, чтобы класс создавался на выделенном месте, а не где-нибудь посреди mfc, приходилось насильственно загонять в регистр ecx указатель на блок памяти. С первым параметром (this) не канает. Ну, и все последующие функции класса точно так же, на асм-е вызываются.
BYTE *pTest = (BYTE*)malloc(1024);
__asm
{
mov ecx, pTest
call Constructor
}
Нифига не работало из-за того, что я по тупости на этом асм-е загонял в качестве параметра BYTE[16] вместо BYTE* - было там такое место. VC подло молчал и все компилил, а потом функция из длл в качестве указателя брала первые 4 байта из BYTE[16], а не указатель на него. Ну, тут все и падало 8-) Я с горя и написал сюда вопрос. Сенькс, что отозвался.
а лучше вот что попробуй... 28.08.01 08:50  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
в VC60 есть возможность отложенной загрузки длл

сам пишешь для этого класса h-файл (так чтобы имена нужных тебе функций полностью совпали) (+не забудь там данных побольше вставить в описании класса - ты же не знаешь сколько их на самом деле)

в параметрах линкера пишешь \delayload:yourdll.dll
линкуешь свою прогу с delayimp.lib

а дальше работаешь с классом как с любым другим

когда потребуется функция класса, специальная функция, вставленная линкером, сама загрузит через LoadLibrary() эту dll и найдёт адрес функции

я сам так не пробовал пока :)
если получится - напиши - интересно :)
1





Рейтинг@Mail.ru


  Copyright © 2001-2026 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach