Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

экспорт не декорированной функции-члена

401
28 ноября 2005 года
Br@in RIPper
289 / / 15.02.2003
в dll проекте имеется класс CTimer со статической функцией-членом определенной как:
static __declspec(dllexport)void _cdecl CTimer::GetInfo(PLUGININFO *pi);

надо, чтобы эта функция экспортировалась как GetInfo, а получается ?GetInfo@CTimer@@SAXPAUPLUGININFO@@@Z



если бы функция была вне класса, т.е. глобальная, проблема решалась бы добавлением extern "C" перед определением функции.
есть какой-нибудь аналог, чтобы так определить функцию в классе?
9.7K
29 ноября 2005 года
DaemonDZK
59 / / 08.11.2005
Цитата:
Originally posted by Br@in RIPper
в dll проекте имеется класс CTimer со статической функцией-членом определенной как:
static __declspec(dllexport)void _cdecl CTimer::GetInfo(PLUGININFO *pi);

надо, чтобы эта функция экспортировалась как GetInfo, а получается ?GetInfo@CTimer@@SAXPAUPLUGININFO@@@Z



если бы функция была вне класса, т.е. глобальная, проблема решалась бы добавлением extern "C" перед определением функции.
есть какой-нибудь аналог, чтобы так определить функцию в классе?



Если твоя функция статическая то можешь сделать так:
***
__declspec(dllexport) extern "C" void GetInfo(PLUGININFO *pi)
{
CTimer::GetInfo(pi);
}

401
29 ноября 2005 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by DaemonDZK
Если твоя функция статическая то можешь сделать так:
***
__declspec(dllexport) extern "C" void GetInfo(PLUGININFO *pi)
{
CTimer::GetInfo(pi);
}




если вставлять модификатор в определение класса, то компилятор выдает ошибку:

 
Код:
class CTimer{
    public:
    extern "C" __declspec(dllexport) PLUGIN_INFO * _cdecl GetInfo();
    private:
};

если использовать модификатор только в определении функции, то никакого толку от этого нет, ф-ия все равно декорирована:
Код:
class CTimer{
    public:
    __declspec(dllexport) PLUGIN_INFO * _cdecl GetInfo();
    private:
};

extern "C"
__declspec(dllexport) PLUGIN_INFO * _cdecl CTimer::GetInfo()
{
    static PLUGIN_INFO pi;
    return & pi;
}

так же никакого эффекта не дает использование модификатора перед определением класса:
 
Код:
extern "C"
class CTimer{
    public:
    __declspec(dllexport) PLUGIN_INFO * _cdecl GetInfo();
    private:
};

работает, только если функция GetInfo - глобальная:
 
Код:
extern "C"
__declspec(dllexport) PLUGIN_INFO * _cdecl GetInfo()
{
    static PLUGIN_INFO pi;
    return & pi;
}

но хотелось бы сохранить структуру программы и экспортировать именно функцию-член
9.7K
29 ноября 2005 года
DaemonDZK
59 / / 08.11.2005
Цитата:
Originally posted by Br@in RIPper
если вставлять модификатор в определение класса, то компилятор выдает ошибку:
 
Код:
class CTimer{
    public:
    extern "C" __declspec(dllexport) PLUGIN_INFO * _cdecl GetInfo();
    private:
};

если использовать модификатор только в определении функции, то никакого толку от этого нет, ф-ия все равно декорирована:
Код:
class CTimer{
    public:
    __declspec(dllexport) PLUGIN_INFO * _cdecl GetInfo();
    private:
};

extern "C"
__declspec(dllexport) PLUGIN_INFO * _cdecl CTimer::GetInfo()
{
    static PLUGIN_INFO pi;
    return & pi;
}

так же никакого эффекта не дает использование модификатора перед определением класса:
 
Код:
extern "C"
class CTimer{
    public:
    __declspec(dllexport) PLUGIN_INFO * _cdecl GetInfo();
    private:
};

работает, только если функция GetInfo - глобальная:
 
Код:
extern "C"
__declspec(dllexport) PLUGIN_INFO * _cdecl GetInfo()
{
    static PLUGIN_INFO pi;
    return & pi;
}

но хотелось бы сохранить структуру программы и экспортировать именно функцию-член



Именно функцию член так экспортировать не получиться. Можешь конечно сделать COM интерфейс но это уже другая история.

401
29 ноября 2005 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by DaemonDZK
Именно функцию член так экспортировать не получиться. Можешь конечно сделать COM интерфейс но это уже другая история.



экспортировать-то получается, не получается отключить декорирование. неужели это невозможно?
может как-нибудь при помощи .def файла?

9.7K
29 ноября 2005 года
DaemonDZK
59 / / 08.11.2005
Цитата:
Originally posted by Br@in RIPper
экспортировать-то получается, не получается отключить декорирование. неужели это невозможно?
может как-нибудь при помощи .def файла?



Невозможно экспортировать член класса без декорирования имен, если ты конечно не собираешся изобреталь свой вариант PE

401
29 ноября 2005 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by DaemonDZK
Невозможно экспортировать член класса без декорирования имен, если ты конечно не собираешся изобреталь свой вариант PE



воздержусь от ответа :)))))

народ, еще есть предложения?

401
30 ноября 2005 года
Br@in RIPper
289 / / 15.02.2003
информация к размышлению.
декорированное имя получается ?GetInfo@CTimer@@QAAPAUPLUGIN_INFO@@XZ
(впереди знак вопроса)

при использовании .def файла:
 
Код:
EXPORTS
    ?GetInfo@CTimer@@QAAPAUPLUGIN_INFO@@XZ = GetInfo

экспортное имя удалось сократить до ?GetInfo

итак, осталось совсем чуть-чуть - избавиться от знака вопроса :)
401
01 декабря 2005 года
Br@in RIPper
289 / / 15.02.2003
все оказалось как всегда гениально. то бишь просто.

добавляем в проект .def файл, в нем пишем:

 
Код:
EXPORTS
    GetInfo


2 DaemonDZK
без всякого изобретения нового заголовка РЕ и прочих COM решений ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог