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

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

ru
Offline Offline
Сообщений: 13


« : 17-06-2008 06:43 » 

к примеру, получаю я указатель на функцию из ДЛЛ
Чем может быть опасен код под пунктом 2 - то есть без указания типа ? Или так можно без опаски делать ?

Код:
typedef FT_STATUS (WINAPI * tdf_FT_ListDevices)(PVOID, PVOID, DWORD);
tdf_FT_ListDevices m_FT_ListDevices;

//1) с указанием типа
m_FT_ListDevices=(tdf_FT_ListDevices)GetProcAddress(m_hmodule,"имя_функции");

//2)без указания типа
DWORD dwd=(DWORD)GetProcAddress(m_hmodule,"имя_функции");
*((DWORD*)(&m_FT_ListDevices))=dwd;

и, допустим, могу приделать проверку на всякий пожарный:
Код:
if(sizeof(DWORD)!=sizeof(m_FT_ListDevices))throw 0;
Записан

Джон
просто
Администратор

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

« Ответ #1 : 17-06-2008 08:18 » 

Лёш, указатель - просто 32ух битное число. Поэтому в самом п.2 первая строчка нет ничего опасного. С таким же успехом ты мог написать после  п.1

DWORD dwd = (DWORD)m_FT_ListDevices;

Все проблемы начнуться только там, где ты будешь использовать dwd.

Вот это я ваще не понял:

*((DWORD*)(&m_FT_ListDevices))=dwd;

Может ты хотел вот так сделать:

m_FT_ListDevices=(tdf_FT_ListDevices)dwd;

Проверка ничего не даёт - только подтвердит, что размер указателя равен размеру DWORD.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 17-06-2008 08:42 » 

Цитата
Лёш, указатель - просто 32ух битное число.
вот поэтому и не вижу ничего опасного и поэтому и спросил - есть ли подводные камни - может когда то на этапе компиляции где то споткнётся или ещё что то там

а использовать dwd я нигде не буду, я же присваиваю полученный адрес мемберу класса
*((DWORD*)(&m_FT_ListDevices))=dwd;
и забываю про dwd , а дальше пользуюсь

m_FT_ListDevices(параметры);


Цитата
Вот это я ваще не понял:
*((DWORD*)(&m_FT_ListDevices))=dwd;
Может ты хотел вот так сделать:
m_FT_ListDevices=(tdf_FT_ListDevices)dwd;

так нет, именно так как я хотел, так и написал - тупо копирую из dwd в указатель на функцию, иначе компилятор кочевряжится ))

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

в общем, всё это я для чего удумал ? чтобы не описывать через typedef кучу мусорных типов (например tdf_FT_ListDevices) ,
а сделать проще:

Код:
FT_STATUS (WINAPI * m_FT_ListDevices)(PVOID, PVOID, DWORD);
DWORD dwd=(DWORD)GetProcAddress(m_hmodule,"имя_функции");
*((DWORD*)(&m_FT_ListDevices))=dwd;

ведь это можно загнать в макрос, после чего вообще красота:
Код:
FT_STATUS (WINAPI * m_F1)(PVOID, PVOID, DWORD);
FT_STATUS (WINAPI * m_F2)(PVOID, PVOID);
FT_STATUS (WINAPI * m_F3)(PVOID);

def_LoadFunc(m_F1,"имя_1_в_длл");
def_LoadFunc(m_F1,"имя_2_в_длл");
def_LoadFunc(m_F1,"имя_3_в_длл");

))
Записан

Джон
просто
Администратор

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

« Ответ #3 : 17-06-2008 09:10 » 

Ну и где разница между кучей тайпдефов и кучей макросов? Ведь параметры и возвращаемое значение надо всё-равно определить для каждого типа ф-ции. Природу не обманешь.

Если, конечно ты поставил цель запутать как можно больше людей, которые будут разбираться с твоим кодом, тогда конечно метода лучше не найти. Особенно вот это:

*((DWORD*)(&m_FT_ListDevices))=dwd;

Слушай, сделай через memcpy - ещё круче будет. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Ochkarik
Команда клуба

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

« Ответ #4 : 17-06-2008 11:50 » 


а использовать dwd я нигде не буду, я же присваиваю полученный адрес мемберу класса
*((DWORD*)(&m_FT_ListDevices))=dwd;

из разряда
Код:
#define TRUE FALSE //Счастливой отладки!

ЗЫ как-то оно.... жестоко, что ли...
« Последнее редактирование: 17-06-2008 11:52 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Джон
просто
Администратор

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

« Ответ #5 : 17-06-2008 11:57 » 

Ochkarik, так не получится - компилятор ругнётся, а вот так точно поподалово Ага

Код:
#undef TRUE
#define TRUE FALSE //Счастливой отладки!
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Ochkarik
Команда клуба

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

« Ответ #6 : 17-06-2008 15:31 » 

Джон, проверил?)))

я с матлабом так попадал пару раз, поставил по привычке переменную цикла j.
вот мнимую единицу и переопределил...
а там вся логика комплексная была, с использованием умножения на эту самую j, как на корень из минус единицы...
долго искал)))

PS ничего, еще есть
Код:
#define if for
ток что попробовал... VS 2005 прогатывает) а сам дефайн не показывает)
« Последнее редактирование: 17-06-2008 15:39 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Джон
просто
Администратор

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

« Ответ #7 : 17-06-2008 15:38 » 

Неа, не проверял. Просто опыт. Уже несколько раз натыкался. При попытке задефайнить уже существующие константы. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Ochkarik
Команда клуба

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

« Ответ #8 : 17-06-2008 16:19 » 

#define if(a) if (!(a))
на ура прокатывает... наводит на размышления....
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 18-06-2008 06:39 » 

Джон, я не просто заменяю тайпдефы макросами, я делаю:
 вместо определения тайпдефа и применения этого типа несколько раз, определяю указатель нужного типа и присваиваю ему значение.
memmove - то же самое, что и =, ничего крутого не видю Улыбаюсь) Да и не ради крутости затеято, а ради удобства
Людей путать я не собирался, в каком месте то?

Ochkarik, нет, это не из этого разряда Улыбаюсь Кстати, есть ещё прикольнее (Инга показала):
Код:
#define true false
Улыбаюсь
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines