Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2012, 09:11   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию Инициализация указателя на функцию

Приветствую! Необходимо инициализировать указатель на функцию. Функция находится в библиотеке. Файл библиотеки - во вложении.

Пример взят отсюда: http://wasm.ru/article.php?article=1001017

Код:
#include <windows.h>
#include <tchar.h>

LPCTSTR LibName = _T("DLLSkeleton.dll");
LPCSTR FunctionName = "TestHello";
LPCTSTR DllNotFound = _T("Cannot load library");
LPCTSTR AppName = _T("Load Library");
LPCTSTR FunctionNotFound = _T("TestHello function not found");

HMODULE hLib;
FARPROC TestHelloAddr;
void (*TestHello)(void);

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    hLib = LoadLibrary(LibName);
    if (hLib == NULL) {
        MessageBox(NULL, DllNotFound, AppName, MB_OK);
        return FALSE;
    }

    TestHelloAddr = GetProcAddress(hLib, FunctionName);
    if (TestHelloAddr == NULL) {
        MessageBox(NULL, FunctionNotFound, AppName, MB_OK);
        return FALSE;
    }

    //TestHello = TestHelloAddr;

    FreeLibrary(hLib);

    return TRUE;
}
Вложения
Тип файла: txt DLLSkeleton.dll.txt (3.0 Кб, 126 просмотров)

Последний раз редактировалось 8Observer8; 01.06.2012 в 10:19. Причина: орфография.
8Observer8 вне форума Ответить с цитированием
Старый 01.06.2012, 09:38   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Теперь работает!

Код:
#include <windows.h>
#include <tchar.h>

LPCTSTR LibName = _T("DLLSkeleton.dll");
LPCSTR FunctionName = "TestHello";
LPCTSTR DllNotFound = _T("Cannot load library");
LPCTSTR AppName = _T("Load Library");
LPCTSTR FunctionNotFound = _T("TestHello function not found");

HMODULE hLib;
FARPROC TestHelloAddr;
void (*TestHello)(void);

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    hLib = LoadLibrary(LibName);
    if (hLib == NULL) {
        MessageBox(NULL, DllNotFound, AppName, MB_OK);
        return FALSE;
    }

    TestHelloAddr = GetProcAddress(hLib, FunctionName);
    if (TestHelloAddr == NULL) {
        MessageBox(NULL, FunctionNotFound, AppName, MB_OK);
        return FALSE;
    }

    (FARPROC)TestHello = TestHelloAddr;

    (*TestHello)();

    FreeLibrary(hLib);

    return TRUE;
}
8Observer8 вне форума Ответить с цитированием
Старый 01.06.2012, 13:19   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

28Observer8
Цитата:
(FARPROC)TestHello = TestHelloAddr;
бред. кастование возвращает rvalue. какой компилятор?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 01.06.2012, 13:34   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Visual C++ 2008 Express Edition

pproger, если можно - поподробней. Да, смотрится бредово. Где-то на просторах форумов нашёл. Я просто попробовал, без всякой надежды (от отчаяния) и заработало!

Последний раз редактировалось 8Observer8; 01.06.2012 в 13:44.
8Observer8 вне форума Ответить с цитированием
Старый 01.06.2012, 14:15   #5
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

(FARPROC)TestHello = TestHelloAddr;

правильный вариант - (FARPROC&)TestHello = TestHelloAddr;
надо будет потом глянуть, чё в асме генерится...
Rififi вне форума Ответить с цитированием
Старый 01.06.2012, 14:26   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Rififi
Цитата:
правильный вариант - (FARPROC&)TestHello = TestHelloAddr;
это чит. правильный вариант -
Цитата:
TestHello = (void(*)(void))TestHelloAddr;
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 01.06.2012, 14:42   #7
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Благодарю!
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача в функцию указателя на начало массива dasvex Помощь студентам 4 28.08.2011 09:29
Передача в функцию указателя на динамический массив Airou Общие вопросы C/C++ 4 05.05.2011 17:07
Си - Выделение кучи -> инициализация указателя -> запись массива Renat060888 Общие вопросы C/C++ 3 22.11.2010 19:31
Передача указателя на массив в функцию loser Общие вопросы C/C++ 2 19.02.2010 19:41
передача указателя в функцию arturka Помощь студентам 3 06.07.2008 00:25