Передача фунции в качестве аргумента
От: Niten  
Дата: 25.04.11 13:17
Оценка:
Доброе день!
Вопрос в следующем:
Есть

class CMyClass {
public:
    typedef DWORD (WINAPI* _BUFFERIN)( LPVOID * );


public:
    CMyClass( _BUFFERIN lpBufferInFunc=NULL );
    virtual ~CMyClass( void );
    _BUFFERIN   dwMyClassBufferIn;
    BOOL    Init();

};

CMyClass::CMyClass(  _BUFFERIN lpBufferInFunc ) 
{
    dwMyClassBufferIn = lpBufferInFunc;
}
CMyClass::~CMyClass(void) 
{
}
BOOL CMyClass::Init( void )
{
    BOOL bRet = TRUE;
    DWORD dwRet = dwMyClassBufferIn( NULL );
    if( dwRet > 0 ){
        bRet = FALSE;
    }
    return bRet;
}

DWORD dwBufferIn( LPVOID *lpvsBuffer );
int _tmain(int argc, _TCHAR* argv[]) 
{
int     iRet = 0;
    lpclMyClass = new CMyClass( (CMyClass::_BUFFERIN ) dwBufferIn );
    lpclMyClass->Init();

    iRet = 0;
    if( lpclMyClass ) {
        delete [] lpclMyClass;
        lpclMyClass = NULL;
    }
    return iRet;
}
//-----------------------------------------------------------------------------
DWORD dwBufferIn( LPVOID *lpvsBuffer ){
DWORD   dwRet = 0;
//~~~~~~~~~~~~~~~~~
    return dwRet;
}

при компиляции ошибок не выдает, но после вызова dwMyClassBufferIn( NULL ) выдает ошибку : 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.

В чем может быть ошибка? И как ее решить?
Re: Передача фунции в качестве аргумента
От: Хвост  
Дата: 25.04.11 13:29
Оценка:
Здравствуйте, Niten, Вы писали:

N>typedef DWORD (WINAPI* _BUFFERIN)( LPVOID * );

здесь calling-convention WINAPI

N>DWORD dwBufferIn( LPVOID *lpvsBuffer );

здесь __cdecl по умолчанию.

N>В чем может быть ошибка?

несоответствие calling convention.
N>И как ее решить?
обеспечить соответствие
People write code, programming languages don't.
Re: Передача фунции в качестве аргумента
От: Сергей Мухин Россия  
Дата: 25.04.11 13:30
Оценка: 1 (1) +1
Здравствуйте, Niten, Вы писали:
N> lpclMyClass = new CMyClass( (CMyClass::_BUFFERIN ) dwBufferIn );
N>при компиляции ошибок не выдает,

N>В чем может быть ошибка? И как ее решить?


попытка во что бы ни было откомпилировать программу, привело к использованию неверного преобразования

пиши

  lpclMyClass = new CMyClass( dwBufferIn );


и думай, почему не компилируется.
---
С уважением,
Сергей Мухин
Re[2]: Передача фунции в качестве аргумента
От: Niten  
Дата: 25.04.11 13:36
Оценка:
Здравствуйте, Хвост, Вы писали:

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


N>>typedef DWORD (WINAPI* _BUFFERIN)( LPVOID * );

Х>здесь calling-convention WINAPI

N>>DWORD dwBufferIn( LPVOID *lpvsBuffer );

Х>здесь __cdecl по умолчанию.

N>>В чем может быть ошибка?

Х>несоответствие calling convention.
N>>И как ее решить?
Х>обеспечить соответствие

Спасибо помогло.

объявил typedef DWORD (__cdecl* _BUFFERIN)( LPVOID * );
вместо typedef DWORD (WINAPI* _BUFFERIN)( LPVOID * ); и все заработало
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.