Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Deklaracja wskaźnika na funkcję

Ostatnio zmodyfikowano 2012-12-31 14:42
Autor Wiadomość
codex
Temat założony przez niniejszego użytkownika
Deklaracja wskaźnika na funkcję
» 2012-12-31 13:50:15
Potrzebuję zadeklarować wskaźnik na funkcje ... tyle, że w momencie gdy go deklaruję w programie nie wiem jeszcze jaki będzie prototyp tej funkcj (to są informacje pobierane od usera).
Oto schemat działania programu w uproszczeniu:


//          PROGRAM POBIERA OD USERA NAZWE BIBLIOTEKI DLL ORAZ
//          NAZWE FUNKCJI EXPORTOWANEJ PRZEZ TA BIBLIOTEKE.
//          NASTEPNIE MIERZY CZAS JEJ WYKONANIA I WYSWIETLA
//          WYNIK POMIARU:
//
//          01).    - LADOWANIE BIBLIOTEKI KTOREJ NAZWA ZNAJDUJE SIE
//                      W POLU IDC_EDIT_LIBRARY.
//          02).    - POBIERANIE ADRESU FUNKCJI KTOREJ NAZWA ZNAJDUJE SIE
//                      W POLU IDC_EDIT_FUNCTION.
//          03).    - POBIERANIE TIMERAX (QueryPerformanceCounter).
//          04).    - WYWOLANIE FUNKCJI KTOREJ ADRES ZOSTAL USTALONY
//                      W PUNKTACH. 01, 02.
//          05).    - PONOWNY POMIAR CZASU (TIMERY).
//          06).    - OBLICZANIE ROZNICY CZASU.
//          07).    - WYSWIETLANIE CZASU WYKONANIA.



oto fragment kodu z problemem:
C/C++
HMODULE lhmod = LoadLibrary( libname );
if( lhmod == NULL )
{
    ShowError( "NIE MOZNA ZALADOWAC PODANEJ BIBLIOTEKI" );
    break;
}
FARPROC lpfn = GetProcAddress( lhmod, fname );
if( lpfn == NULL )
{
    ShowError( "NIE MOZNA UZYSKAC ADRESU \
                                      WSKAZANEJ PROCEDURY" );
    break;
}
QueryPerformanceCounter( & tx );
( lpfn )();
QueryPerformanceCounter( & ty );

W takim ukladzie dziala tylko dla funkcji bez argumentowej np. kernel32.dll\GetLastError

Niby przychodzi mi do głowy rozwiązanie - tyle, że wymagało by wstawki asemblera gdzie wrzucam argumenty na stos przed wywołaniem testowanej fukcji.
No tyle, że właśnie chciał bym to w c++ zrealizować. Da się to zrobić ?
P-72503
Mrovqa
» 2012-12-31 14:42:49
Wskaźnik na funkcję deklaruje się podobnie jak funkcję (dodajesz tylko gwiazdkę przed nazwą i obejmujesz nawiasem):
C/C++
int( * wskaznik )( int arg1, char arg2 );
By dużo nie pisać można użyć typedefa:
C/C++
typedef int( * )( int arg1, char arg2 ) wskaznik_na_funkcje;
// i uzycie:
wskaznik_na_funkcje abc;
abc = //...
( * abc )( 5, 'c' );
P-72517
« 1 »
  Strona 1 z 1