Есть такой адрес в загруженном модуле Exe.
От: flashpoint Россия  
Дата: 27.03.06 15:07
Оценка:
const Thread::`vftable'
или
??_7Thread@@6B@

Подскажите плз.. как используя функцию GetProcAddress(hExe,"???_7Thread@@6B@")

преобразовать это в класс Thread чтобы далее вызывать его методы ???
Re: Есть такой адрес в загруженном модуле Exe.
От: alexeiz  
Дата: 27.03.06 21:58
Оценка:
Здравствуйте, flashpoint, Вы писали:

F>const Thread::`vftable'

F>или
F>??_7Thread@@6B@

F>Подскажите плз.. как используя функцию GetProcAddress(hExe,"???_7Thread@@6B@")


F>преобразовать это в класс Thread чтобы далее вызывать его методы ???


В корне неправельный подход к экспотру/импорту классов. Нужно экпортировать extern "C" функцию, которая будет предоставлять тебе доступ к объекту класса. Получив объект, ты без проблем сможешь вызывать его методы.
#if defined(building_dll) // defined in your build environment
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif

extern "C" DLL_EXPORT Thread * GetThread();
class DLL_EXPORT Thread
{
...
};

// your client code
typedef Thread * (*GetThreadFuncPtr)();
GetThreadFuncPtr GetThreadFunc = static_cast<GetThreadFuncPtr>(GetProcAddress(hDll, "GetThread"));
Thread * obj = GetThreadFunc();
Re[2]: Есть такой адрес в загруженном модуле Exe.
От: flashpoint Россия  
Дата: 28.03.06 12:17
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Здравствуйте, flashpoint, Вы писали:


F>>const Thread::`vftable'

F>>или
F>>??_7Thread@@6B@

F>>Подскажите плз.. как используя функцию GetProcAddress(hExe,"???_7Thread@@6B@")


F>>преобразовать это в класс Thread чтобы далее вызывать его методы ???


A>В корне неправельный подход к экспотру/импорту классов. Нужно экпортировать extern "C" функцию, которая будет предоставлять тебе доступ к объекту класса. Получив объект, ты без проблем сможешь вызывать его методы.

A>
A>#if defined(building_dll) // defined in your build environment
A>#define DLL_EXPORT __declspec(dllexport)
A>#else
A>#define DLL_EXPORT __declspec(dllimport)
A>#endif

A>extern "C" DLL_EXPORT Thread * GetThread();
A>class DLL_EXPORT Thread
A>{
A>...
A>};

A>// your client code
A>typedef Thread * (*GetThreadFuncPtr)();
A>GetThreadFuncPtr GetThreadFunc = static_cast<GetThreadFuncPtr>(GetProcAddress(hDll, "GetThread"));
A>Thread * obj = GetThreadFunc();
A>


Меня просто неправильно поняли
Задача такова:
Мой COM модуль загрузила внешняя программа. Мне надо из своего модуля получить указатель на AFX_MODULE_STATE*
Я знаю что у этой программы есть загруженный константный класс Thread у которого есть нужные мне методы. Их описание у меня тоже есть.
Я знаю что этот модуль содержит экпортируемую-задекорированную функцию const Thread::`vftable'
Теперь мне надо получив указатель на таблицу vftable превратить это в класс. Это мне и нужно !
Re[3]: Есть такой адрес в загруженном модуле Exe.
От: alexeiz  
Дата: 28.03.06 19:11
Оценка:
Здравствуйте, flashpoint, Вы писали:

F>Задача такова:

F>Мой COM модуль загрузила внешняя программа. Мне надо из своего модуля получить указатель на AFX_MODULE_STATE*
F>Я знаю что у этой программы есть загруженный константный класс Thread у которого есть нужные мне методы. Их описание у меня тоже есть.
F>Я знаю что этот модуль содержит экпортируемую-задекорированную функцию const Thread::`vftable'
F>Теперь мне надо получив указатель на таблицу vftable превратить это в класс. Это мне и нужно !

vftable находится в памяти отдельно от объекта класса. На класс создаётся одна виртуальная таблица. Объекты класса имеют указатель на эту виртуальную таблицу. Поэтому по самой виртуальной таблице ты не получишь объект. И вообще то, что ты хочешь сделать, выглядит странно. Попробуй подумать можно-ли добиться этого другим способом.
Re[4]: Есть такой адрес в загруженном модуле Exe.
От: flashpoint Россия  
Дата: 29.03.06 05:09
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Здравствуйте, flashpoint, Вы писали:


F>>Задача такова:

F>>Мой COM модуль загрузила внешняя программа. Мне надо из своего модуля получить указатель на AFX_MODULE_STATE*
F>>Я знаю что у этой программы есть загруженный константный класс Thread у которого есть нужные мне методы. Их описание у меня тоже есть.
F>>Я знаю что этот модуль содержит экпортируемую-задекорированную функцию const Thread::`vftable'
F>>Теперь мне надо получив указатель на таблицу vftable превратить это в класс. Это мне и нужно !

A>vftable находится в памяти отдельно от объекта класса. На класс создаётся одна виртуальная таблица. Объекты класса имеют указатель на эту виртуальную таблицу. Поэтому по самой виртуальной таблице ты не получишь объект. И вообще то, что ты хочешь сделать, выглядит странно. Попробуй подумать можно-ли добиться этого другим способом.



Спасибо. Это я уже понял. Подумал, и сделал по другому. А именно доступ к AFX_MODULE_STATE основного приложения из паралелльного потока в COM объекте.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.