НЕ компилит С++ ошибка С2440

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

  1. jeka101

    jeka101 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2009
    Сообщения:
    9
    Здрасте у меня вот тут проблема с компиляцией.
    HEXHook.cpp
    Код (Text):
    1. void CPPFixes::Initialize()
    2. {
    3.     WriteInstruction(0x8E799C, (INT32)CItemd::GetBodyPartFromName, 0, ASM_CALL);        //Slot New
    4. }
    CItem.cpp
    Код (Text):
    1. int CItemd::GetBodyPartFromName(int nLen, WCHAR* wcsName)
    2. {
    3.     if(_wcsicmp(wcsName, L"bracelet") == 0)
    4.         return 0x200000;
    5.     else if(_wcsicmp(wcsName, L"talisman") == 0)
    6.         return 0x100000;
    7.     else if(_wcsicmp(wcsName, L"face") == 0)
    8.         return 0x40000;
    9.     else if(_wcsicmp(wcsName, L"lhair") == 0)
    10.         return 0x10000;
    11.     else
    12.     {
    13.         typedef int (__fastcall*_TFUNC)(int, WCHAR*);
    14.         _TFUNC _FUNC = (_TFUNC)0x8E76F0;
    15.         return _FUNC(nLen, wcsName);
    16.     }
    17.  
    18. };
    CItem.h
    Код (Text):
    1. class CItemd
    2. {
    3. public:
    4.  int GetBodyPartFromName(int nLen, WCHAR* wcsName);
    5. };
    У меня ошибка Error 9 error C2440: 'type cast' : cannot convert from 'int (__cdecl CItemd::* )(int,WCHAR *)' to 'INT32' d:\2Ex\L2E\CPPFixes.cpp 27
    Как лечица я в прогнраммировании не оч сильно опытен...
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    WriteInstruction(0x8E799C, (INT32)(void*)&CItemd::GetBodyPartFromName, 0, ASM_CALL);
     
  3. jeka101

    jeka101 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2009
    Сообщения:
    9
    Error 1 error C2440: 'type cast' : cannot convert from 'int (__cdecl CItemd::* )(int,WCHAR *)' to 'void *' d:\L2E\L2E\CPPFixes.cpp 27
    Всеравно.
     
  4. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Указатель на метод просто так в void* не прокастишь. Следующее работает на некоторых компиляторах (MSVC).
    Код (Text):
    1. typedef int (CItemd::*pGetBodyPartFromName)(int, WCHAR*);
    2. union Caster
    3. {
    4.   pGetBodyPartFromName ptrval;
    5.   INT32 intval;
    6. }
    7. ...
    8. Caster c;
    9. c.ptrval = &CItemd::GetBodyPartFromName;
    10. WriteInstruction(0x8E799C, c.intval, 0, ASM_CALL);
    Учти, что с виртуальными методами такой фокус не пройдёт.
     
  5. jeka101

    jeka101 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2009
    Сообщения:
    9
    Да компилю я х64 программу. VC 2005
    Походу непроходит...
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А зачем это?
     
  7. jeka101

    jeka101 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2009
    Сообщения:
    9
    Что код?
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Зачем указатель на метод класса приводить в int? Добавили этот int куда-нибудь и что?
     
  9. jeka101

    jeka101 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2009
    Сообщения:
    9
    Я же писал что я неочень опытен, был бы я кул программер наверно бы у меня бы небыло проблем...
    Так что нуждаюсь пока в советах
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Советую сохранять не int-ы, а указатели на методы, избежав ненужных преобразований.
    Ещё для меня удивительно это - "_TFUNC _FUNC = (_TFUNC)0x8E76F0;"
     
  11. jeka101

    jeka101 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2009
    Сообщения:
    9
    Нету ещё вариантов по этому еррору?
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Попробуй такое.
    Код (Text):
    1. typedef int (CItemd::*p)(int, WCHAR*);
    2. p p1 = &CItemd::GetBodyPartFromName;
    3. int i = (int&)p1;
    Всё равно не понимаю в этом смысла.
     
  13. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Должно быть
    Код (Text):
    1. static int GetBodyPartFromName(int nLen, WCHAR* wcsName);
    Функции-члены класса вызываются по-другому (им ещё нужен указатель this), нежели обычные функции (и статические функции), так что компилятор доступными ему способами мешает выстрелить себе в ногу.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    diamond
    При чём здесь вызов метода и выстрелить в ногу? Сомнительно преобразование в int, хотя чего только не бывает на практике.
     
  15. jeka101

    jeka101 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2009
    Сообщения:
    9
    вот что вышло: Error 10 error LNK2001: unresolved external symbol GetBodyPartFromName CPPFixes.obj
     
  16. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    int (CItemd::*ptr)(int, WCHAR*) = &CItemd::GetBodyPartFromName;

    WriteInstruction(0x8E799C, *(INT32*)&ptr, 0, ASM_CALL);
     
  17. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Это уже ошибка линковки, то есть компилятор успешно проглотил код. Unresolved external symbol означает, что линковщик не видит, где реализована функция. Скорее всего, из-за того, что CItem.cpp не компилируется или не подаётся на вход линковщику.
     
  18. jeka101

    jeka101 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2009
    Сообщения:
    9
    и что мне пробовтаь делать?
     
  19. jeka101

    jeka101 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2009
    Сообщения:
    9
    Всем спасиба за помощь, всем благодарен. Я разобрался все получилось. =)