class CTimer{
public:
extern "C" __declspec(dllexport) PLUGIN_INFO * _cdecl GetInfo();
private:
};
экспорт не декорированной функции-члена
static __declspec(dllexport)void _cdecl CTimer::GetInfo(PLUGININFO *pi);
надо, чтобы эта функция экспортировалась как GetInfo, а получается ?GetInfo@CTimer@@SAXPAUPLUGININFO@@@Z
если бы функция была вне класса, т.е. глобальная, проблема решалась бы добавлением extern "C" перед определением функции.
есть какой-нибудь аналог, чтобы так определить функцию в классе?
Цитата:
Originally posted by Br@in RIPper
в dll проекте имеется класс CTimer со статической функцией-членом определенной как:
static __declspec(dllexport)void _cdecl CTimer::GetInfo(PLUGININFO *pi);
надо, чтобы эта функция экспортировалась как GetInfo, а получается ?GetInfo@CTimer@@SAXPAUPLUGININFO@@@Z
если бы функция была вне класса, т.е. глобальная, проблема решалась бы добавлением extern "C" перед определением функции.
есть какой-нибудь аналог, чтобы так определить функцию в классе?
в 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);
}
Цитата:
Originally posted by DaemonDZK
Если твоя функция статическая то можешь сделать так:
***
__declspec(dllexport) extern "C" void GetInfo(PLUGININFO *pi)
{
CTimer::GetInfo(pi);
}
Если твоя функция статическая то можешь сделать так:
***
__declspec(dllexport) extern "C" void GetInfo(PLUGININFO *pi)
{
CTimer::GetInfo(pi);
}
если вставлять модификатор в определение класса, то компилятор выдает ошибку:
Код:
если использовать модификатор только в определении функции, то никакого толку от этого нет, ф-ия все равно декорирована:
Код:
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;
}
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:
};
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;
}
__declspec(dllexport) PLUGIN_INFO * _cdecl GetInfo()
{
static PLUGIN_INFO pi;
return & pi;
}
но хотелось бы сохранить структуру программы и экспортировать именно функцию-член
Цитата:
Originally posted by Br@in RIPper
если вставлять модификатор в определение класса, то компилятор выдает ошибку:
если использовать модификатор только в определении функции, то никакого толку от этого нет, ф-ия все равно декорирована:
так же никакого эффекта не дает использование модификатора перед определением класса:
работает, только если функция GetInfo - глобальная:
но хотелось бы сохранить структуру программы и экспортировать именно функцию-член
если вставлять модификатор в определение класса, то компилятор выдает ошибку:
Код:
class CTimer{
public:
extern "C" __declspec(dllexport) PLUGIN_INFO * _cdecl GetInfo();
private:
};
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;
}
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:
};
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;
}
__declspec(dllexport) PLUGIN_INFO * _cdecl GetInfo()
{
static PLUGIN_INFO pi;
return & pi;
}
но хотелось бы сохранить структуру программы и экспортировать именно функцию-член
Именно функцию член так экспортировать не получиться. Можешь конечно сделать COM интерфейс но это уже другая история.
Цитата:
Originally posted by DaemonDZK
Именно функцию член так экспортировать не получиться. Можешь конечно сделать COM интерфейс но это уже другая история.
Именно функцию член так экспортировать не получиться. Можешь конечно сделать COM интерфейс но это уже другая история.
экспортировать-то получается, не получается отключить декорирование. неужели это невозможно?
может как-нибудь при помощи .def файла?
Цитата:
Originally posted by Br@in RIPper
экспортировать-то получается, не получается отключить декорирование. неужели это невозможно?
может как-нибудь при помощи .def файла?
экспортировать-то получается, не получается отключить декорирование. неужели это невозможно?
может как-нибудь при помощи .def файла?
Невозможно экспортировать член класса без декорирования имен, если ты конечно не собираешся изобреталь свой вариант PE
Цитата:
Originally posted by DaemonDZK
Невозможно экспортировать член класса без декорирования имен, если ты конечно не собираешся изобреталь свой вариант PE
Невозможно экспортировать член класса без декорирования имен, если ты конечно не собираешся изобреталь свой вариант PE
воздержусь от ответа :)))))
народ, еще есть предложения?
декорированное имя получается ?GetInfo@CTimer@@QAAPAUPLUGIN_INFO@@XZ
(впереди знак вопроса)
при использовании .def файла:
Код:
EXPORTS
?GetInfo@CTimer@@QAAPAUPLUGIN_INFO@@XZ = GetInfo
?GetInfo@CTimer@@QAAPAUPLUGIN_INFO@@XZ = GetInfo
экспортное имя удалось сократить до ?GetInfo
итак, осталось совсем чуть-чуть - избавиться от знака вопроса :)
добавляем в проект .def файл, в нем пишем:
Код:
EXPORTS
GetInfo
GetInfo
2 DaemonDZK
без всякого изобретения нового заголовка РЕ и прочих COM решений ;)