Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Приведение типов данных и GetProcAddress  (Прочитано 6140 раз)
0 Пользователей и 1 Гость смотрят эту тему.
homosapien
Гость
« : 13-01-2008 13:41 » 

Непонятно, как получить правильный адрес. Мсдн и гугл не помогли Жаль

Код:
#include <windows.h>
int main()
{

HMODULE hDll;
DWORD dw;
BOOL (*InstallNewDevice)(HWND hwndParent, LPGUID ClassGuid, PDWORD pReboot); 
hDll = LoadLibrary("newdev.dll");
if(hDll == NULL) MessageBoxA(HWND_DESKTOP, "something is wrong", "error", MB_OK);

InstallNewDevice = /* Вот тут не понятно :( */  GetProcAddress(hDll,"InstallNewDevice"); // ТУТ
InstallNewDevice(NULL, (GUID*)&GUID_NULL, &dw);

return 0;       
}

ps винапи изучаю сравнительно недавно,  не серчайте Улыбаюсь
« Последнее редактирование: 13-01-2008 14:25 от homosapien » Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #1 : 13-01-2008 14:36 » 

Код:
typedef BOOL (__stdcall *InstallNewDevice)(HWND hwndParent, LPGUID ClassGuid, PDWORD pReboot);

InstallNewDevice pFunction;


pFunction=(InstallNewDevice)::GetProcAddress(hDll,"InstallNewDevice");
pFunction(NULL, (GUID*)&GUID_NULL, &dw);
Записан
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 13-01-2008 14:40 » 

homosapien, в этом примере не в WinAPI дело. Улыбаюсь

Код:
BOOL (*InstallNewDevice)(HWND hwndParent, LPGUID ClassGuid, PDWORD pReboot);
Эта строчка на самом деле должна определять тип. Но здесь пропущено ключевое слово typedef

Выглядеть это будет так:
Код:
typedef BOOL (*InstallNewDevice)(HWND hwndParent, LPGUID ClassGuid, PDWORD pReboot);


Теперь у нас есть тип InstallNewDevice, который является указателем на функции с такой сигнатурой.
Определяем переменную этого типа
Код:
InstallNewDevice pInstallNewDevice
// А потом пользуемся уже этим указателем в выражениях с GetProcAddress
// вот так
pInstallNewDevice = GetProcAddress(hDll,"InstallNewDevice");
// И в дальнейшем вызываем функцию по указателю
pInstallNewDevice(NULL, (GUID*)&GUID_NULL, &dw);
 

Ой, опередили, ну ладно пусть будет все равно Улыбаюсь
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
v2
Помогающий

ua
Offline Offline

« Ответ #3 : 13-01-2008 15:17 » 

А можно и так:
Код:
#include <windows.h>

//typedef BOOL (__stdcall *pInstNewDev)(HWND hwndParent, LPGUID ClassGuid, PDWORD pReboot);

int main(int argc, char* argv[])
{
HMODULE hDll;
DWORD dw;

BOOL (__stdcall *InstallNewDevice)(HWND hwndParent, LPGUID ClassGuid, PDWORD pReboot);

hDll = LoadLibrary("newdev.dll");
if(hDll == NULL) MessageBoxA(HWND_DESKTOP, "something is wrong", "error", MB_OK);

InstallNewDevice=(BOOL (__stdcall *)(HWND hwndParent, LPGUID ClassGuid, PDWORD pReboot))GetProcAddress(hDll,"InstallNewDevice");
InstallNewDevice(NULL, (GUID*)&GUID_NULL, &dw);

return 0;       

}

Цитата
- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines