Страница 1 из 1

Поинтер из ДЛЛ

Добавлено: 09 июл 2004, 12:31
Sulik
Итак задача.... Имеецаа ДЛЛ написанная мною, не вдаваясь в подробности скажу, что подхватывать её надо на лету и никак иначе, так что LoadLibrary мне обеспечен. Из своей проги я вызываю методы своей ДЛЛки, и всё прекраснейшим образом работает но.... Стоит мне вызвать метод, который возвращает, или принимает поинтер.. любой поинтер как я получаю:

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

Ошибку можно игнорить, но после этого начинаецца форменное загаживание стэка, вплоть до того, что дебагер в такие места приходит, что волосы встают дыбом причём не только на голове... Особенно весело когда дебагер прыгает на одну строчку назад.... Как вы понимаете так программа работать не может... Пробовал играться всякими __stdcall __fastcall (WINAPI CALLBACK PASCAL как выяснилось представляют собой __stdcall). Так как мне быть! Прикладываю код вызова метода


float *ff;
ff = NULL;
HMODULE DLL;
typedef void (WINAPI MESS)(float *);
MESS *Prep = NULL;
DLL = AfxLoadLibrary("MedusaDynamic.dll");
if(DLL != NULL)
{
Prep = (MESS *)GetProcAddress(DLL, "GetPointer");

if(Succ = (Prep != NULL))
(Prep)(ff);
На последней строчке и выскакивает ошибка....

Сам метод GetPointer объявлена так...
void WINAPI GetPointer(float *);

И реализована так:

void CMedusaDynamicApp::GetPointer(float *out)
{
out = ((CMedusaDynamicApp *)AfxGetApp())->InternalGetPointer();
}

Метод InternalGetPointer возвращает указатель на float который по любому существует, находится в области видимости и память выделена.... Что мне делать?
:?:

Добавлено: 09 июл 2004, 14:32
Absurd
Как это тебе удалось задекларировать GetPointer как WINAPI (aka __stdcall), а реализовать его как нестатический метод класса, который неявно имеет соглашение о вызове thiscall?

Добавлено: 09 июл 2004, 16:09
Sulik
Так и удалось! Камипилер это пропускает... Я уже разабрался. Проблема решается заменой объявления метода GetPointer в моей дллке.
Вместо
void WINAPI GetPointer(float *);
Надо
void __cdecl GetPointer(float *);

А вот ловить его надо как WINAPI и всё работает преотличнейшим образом! У меня даже начальник обрадовался. Эту работу я должен был сделать неделю назад.... =)))))

Добавлено: 09 июл 2004, 18:28
Eugie
Sulik, хочешь сказать, что тебе удалось объявить метод класса как отдельно-стоящую функцию??? Не смеши :)

Добавлено: 12 июл 2004, 09:28
Sulik
Теперь понял что вас интересует. Для любителей попридираться без повода, не оказывая реальной помощи, пишу отчётливее:
class CMedusaDynamicApp : public CWinApp
{
public:
void __cdecl GetPointer(float *);
}
Я думал будет достаточно только самой строки объявления метода. Вот и всё... Надеюсь я Вас исчо раз посмешил.... :lol:
ЗЫ господа, если можете помочь - помогайте. Не можете, то хотяб не флудите! =)))

Добавлено: 12 июл 2004, 09:43
Sulik
Извиняюсь за некоторую грубость. Утро, понедельник, что ещё человеку для грубости нужно? =))

Добавлено: 12 июл 2004, 10:30
Absurd
class CMedusaDynamicApp : public CWinApp
{
public:
void __cdecl GetPointer(float *);
}
Не может он быть __cdecl. У нестатических методов класса есть один дополнительный неявный параметр - this.
Без этого параметра никак нельзя. Соглашение __cdecl передачу этого параметра никак не обеспечивает.
Скорей всего компилятор это пропускает, но игнорирует. Методы объектов всегда вызываются через thiscall.
господа, если можете помочь - помогайте. Не можете, то хотяб не флудите! =)))
Ну, если я увижу допустим своего сына, колющего микроскопом орехи, я сначала нафлудю, а потом отниму микроскоп.
В данном случае возможность отнять тонкий инструмент я не имею. Остается флудить.
Извиняюсь за некоторую грубость. Утро, понедельник, что ещё человеку для грубости нужно? =))
Там есть кнопочка - отредактировать сообщение. Попробуй ее.

Добавлено: 12 июл 2004, 10:34
Sulik
Пардон! Кнопошку я проигнорил! =)))) А по поводу cdecl я этого не знал... Но фишка в том, что ежели я его уберу, то работать перестаёт.. =((((

Добавлено: 12 июл 2004, 12:25
Romeo
Господи, да не в cdecl проблема, а в идентификаторе static, который отсутствует...

Добавлено: 12 июл 2004, 12:33
Sulik
Надо попробовать. Это был мой первый опыт подхвата ДЛЛ на лету... Так что ваша инфа была для меня новой, пасиб шо рассказали. Как много нового узнаёшь! =)))))