Помогите разобратся с GCC компилятором

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 10 июн 2009.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Такая вот строка кода
    Код (Text):
    1. (int(__stdcall*)())ZwQuerySystemInformation=GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
    Прекрасно ведет себя в борладнском компиляторе.А в GCC "ISO C++ forbids cast to non-reference type used as lvalue"
    А вот если изменить так
    Код (Text):
    1. ZwQuerySystemInformation=(int(__stdcall*)())GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
    То уже ошибка совсем другого рода
    Я конечно понимаю что форточки не линукс,но что же все таки надо этому GCC ???
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Он просто заставляет тебя сделать временные переменные из-за этих casts. Разложи кождое действие а отдельную строку (выражение) и всё скомпилится.
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Я непонимаю как можно разложить строку с присвоением и приведением типа значения???
     
  4. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    _nic
    мож так
    Код (Text):
    1. long _addr=GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
    2. ZwQuerySystemInformation=(int(__stdcall*) _addr;
    под рукой его нет чтоб проверить, мож и не так :dntknw:
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    long _addr=GetProcAddress сильно грубо.Ругается invalid conversion from `int (*)()' to `long int'
     
  6. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    А если так
    Код (Text):
    1. long *_addr=(long *)GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
    2. ZwQuerySystemInformation=(int(__stdcall*) _addr;
    То матерится на вторую строку "primary-expression before "int" ","expected `)' before "int" "
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    _nic
    так у тебя там ляп с не закрытой скобкой
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    ZwQuerySystemInformation=(int(__stdcall*)) _addr;
     
  9. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Ляп это да.Но если так "ZwQuerySystemInformation=(int(__stdcall*)) _addr;" то получается "cannot convert `int*' to `dispp::NTSTATUS (*)(dispp()::SYSTEMINFOCLASS, void*, ULONG, long unsigned int*)' in assignment "
     
  10. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Я начинаю подозревать что дело все таки не в этом
    ЗЫ:неужели столько мало людей на этом форуме сталкивалось с GCC???
     
  11. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _nic
    Попробуй вот так (проверить не могу):
    Код (Text):
    1. (FARPROC&)ZwQuerySystemInformation=GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
     
  12. J0nny

    J0nny New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2009
    Сообщения:
    1
    Код (Text):
    1. (void*) ZwQuerySystemInformation = GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
     
  13. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Код (Text):
    1. typedef int (query_t)();
    2.  
    3. int Test()
    4. {
    5.     HMODULE mod = GetModuleHandle("ntdll.dll");
    6.     query_t *ZwQuerySystemInformation = (query_t *)GetProcAddress(mod, "ZwQuerySystemInformation");
    7.  
    8.     return ZwQuerySystemInformation();
    9. }
     
  14. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    _nic
    Как у тебя объявлено ZwQuerySystemInformation?
    Судя по всему примерно так:
    Код (Text):
    1. dispp::NTSTATUS ZwQuerySystemInformation(dispp()::SYSTEMINFOCLASS, void*, ULONG, long unsigned int*);
    подозреваю, что __stdcall забыл, то есть надо:
    Код (Text):
    1. dispp::NTSTATUS __stdcall ZwQuerySystemInformation(dispp()::SYSTEMINFOCLASS, void*, ULONG, long unsigned int*);
    Вот и пиши так:
    Код (Text):
    1. ZwQuerySystemInformation=(dispp::NTSTATUS (__stdcall*)(dispp()::SYSTEMINFOCLASS, void*, ULONG, long unsigned int*))GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
    Борладн - сакс, однозначно. Хавает шо попало, а делает шо хочет. Иногда его такая пурга несет...