Указатель на внешнюю функцию

Тема в разделе "LANGS.C", создана пользователем Bonez92, 13 дек 2009.

  1. Bonez92

    Bonez92 Евгений

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    16
    Адрес:
    Уфа
    Всем привет.
    Проблема: Хочу установить указатель на функцию из внешней библиотеки. Вот мой код:
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. int main()
    5. {
    6.     long hModule, lpFunction;
    7.     long (*vbLenBstr)(OLECHAR*);
    8.     char iop[]="AB";
    9.    
    10.     printf("__vbaLenBStr Example\n\n");
    11.    
    12.     hModule=(long)LoadLibrary("msvbvm60.dll");
    13.     lpFunction=(long)GetProcAddress((HMODULE)hModule,"DllFunctionCall");
    14.     vbLenBstr=(long)lpFunction;
    15.    
    16.    
    17.     return 0;
    18. }
    Но компилятор выдает ошибку при обработке строки "vbLenBstr=(long)lpFunction;" (invalid conversion from `long int` to `long int (*)(OLECHAR*)`.

    Вопрос: Как мне правильно установить указатель на функцию.
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    чтобы вызвать функцию по указателю, надо писать
    (*func)(arg)
    при этом тип указателя должен быть
    long int (*)(OLECHAR*)
    как и говорит компилятор
    т.е.
    long int (*lpFunction)(OLECHAR*);
     
  3. Bonez92

    Bonez92 Евгений

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    16
    Адрес:
    Уфа
    Понял. Спасибо.
     
  4. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Не забываем про конвенцию вызова.

    А для простоты лучше объявить тип функции отдельно:

    typedef long __stdcall __vbaLenBStr_t(OLECHAR*);
    __vbaLenBStr_t* vbLenBstr;
    vbLenBstr = (__vbaLenBStr_t*)GetProcAddress((HMODULE)hModule,"DllFunctionCall");

    Исходный вариант видимо предполагалось делать так:
    *(long*)&vbLenBstr=lpFunction;

    но это неправильно, long не всегда равен размеру указателя, надо использовать UINT_PTR