Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |
[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 и найдёт адрес функции
я сам так не пробовал пока :)
если получится - напиши - интересно :)
|
|
|