Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.147.215] |
|
Сообщ.
#1
,
|
|
|
#ifndef __StatApp_H #define __StatApp_H #ifdef __cplusplus extern "C"{ #endif __declspec( dllexport ) class Stat1{ public: void QuickSort( int, int, double * ); }; extern const Stat1 Stat1App; #ifdef __cplusplus } #endif #endif есть вот такая конструкция, как видно есть объект Stat1App. Как можно обратиться из программы к функции QuickSort этого объекта. И еще лучше ли построить такую конструкцию #ifndef __StatApp_H #define __StatApp_H #ifdef __cplusplus extern "C"{ #endif namespace Stat1{ __declspec( dllexport ) void QuickSort( int, int, double * ); } #ifdef __cplusplus } #endif #endif тоесть заменить обращение через объект на namesapce. Хотелось бы узнать стоит ли, возможно ли ? Цеплятся конечно же динамически, изать либ получается без проблем. Доступ к функциям тоже, а вот через объект не могу догнать как !? Добавлено в : я тут потихоньку решаю свою проблему, забыл дописать __declspec( dllexport ) к extern const Stat1 Stat1App; теперь имею _Stat1App @4; _Stat1App в экспорте но что получать в GetProcAddress( hlib, "_Stat1App" ); ?? я же не хочу хедер использовать, а потому не знаю класса ?? |
Сообщ.
#2
,
|
|
|
Метод объекта отличается от обычной функции только тем, что неявно и первым параметром в него передается указатель на объект:
C++: void MyClass::DoIt(int a, int b) на C выглядит так: void DoIt(struct MyClass *_this, int a, int b) Трабл в том, что метод будет иметь декорированное имя ?DoIt@MyClass@@QAEXHH@Z (MSVC 6) |
Сообщ.
#3
,
|
|
|
Я знал что гуру ДЛЛ Visitor что то ответит
С получением метода класса я проблем не вижу, понятно к чему надо кастануть void ( MyClass::*OnDoIt )( int, int, double *); OnDoIt fptr = (OnDoIt)GetProcAddress( hlib, "?DoIt@MyClass@@QAEXHH..." ); Но уже при такой записи возникает непонятки, что за MyClass ? хедера ведь нет. для функции можно это обойти предобъявлением типа class MyClass; во всяком случае линкер ругатся не будет (?) Но ведь нужно вызвать эту функцию! Тут похоже без хедера ни куда, где будет класс описан ? А как с моим примером ? там переменная - объект класса, надобы указатель на не вытащить Stat1 *pStat = &((Stat)GetProcAddress( hlib, "_Stat1App" )); ?? как такое замутить ? |
Сообщ.
#4
,
|
|
|
Ну тут уже при помощи зравого смысла и
Можно в длл сделать функцию, которая конструирует объект и возвращает указатель на него (или просто возвращает указатель на глобальный объект), например. |
Сообщ.
#5
,
|
|
|
Цитата Visitor, 5.02.04, 07:45 Можно в длл сделать функцию, которая конструирует объект и возвращает указатель на него (или просто возвращает указатель на глобальный объект), например. Простите, на что ? void * ? Я просто понимаю, что нехватеает какой то фундаментальной ступеньки в знаниях, хочу ликвидировать это. Если нет недера а только длл, в которой не только функции а объектная структура, могу ли я работать с объектами или это по определению не возможно ? так как нет объявлений этих структур ? |
Сообщ.
#6
,
|
|
|
class CObj { public: void Metod() { //---------- } } //экспорт extern "C" __declspec(dllexport) void NewObj(void** handle) { *handle=new CObj; } #define OPOINT CObj *op;op=(CObj*)handle; extern "C" __declspec(dllexport) void FreeObj(void* handle) { OPOINT delete op; } extern "C" __declspec(dllexport) void Metod(void* handle) { OPOINT op->Metod(); } //юзанье void* p; NewObj(&p);//создание Metod(p);//использование FreeObj(p);//..удаление если стандартная длл - то тока так. иначе - только через MFC расширения dll или COM или .NET |
Сообщ.
#7
,
|
|
|
неплохой подход. Но работа с таким объектом очень опасная будет. Да и неудобная. В добавок для каждого метода надо еще обертку писать - жуть.
Но за решение моего вопроса спасибо, ++; |
Сообщ.
#8
,
|
|
|
Мне кажется что LoadLibrali с лёгкостью загрузит функцию по её декодированому имени осталось лишь привести её к указателю на функцию класса
|