Не могу понять почему не компилится?

Тема в разделе "LANGS.C", создана пользователем progstone, 9 апр 2007.

  1. progstone

    progstone New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2007
    Сообщения:
    14
    Не могу понять почему не компилится(Visual Studio .NET 2005)+SP1 слитый с msdn.microsoft.com
    #pragma comment(linker, "/export:MemoryCopy=KERNEL32.RtlMoveMemory")
    void main()
    {
    int k=0;
    char chX[256];
    char chT[256];
    lstrcpyA(chT,"Hello");
    MemoryCopy(chX,chT,sizeof("Hello"));
    MessageBoxA(0,chX,"caption",0);
    }
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Что за зверь MemoryCopy?
    Может быть memcpy или memmove?
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Разве kernel32 экспортирует RtlMoveMemory? Вроде как в ntdll такое есть.
     
  4. ShadoWich

    ShadoWich New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2007
    Сообщения:
    35
    extern "C" void MemoryCopy(void *, void *, DWORD);
    тока не факт что слинкуется
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    #pragma comment(lib, "ntdll")
    #pragma comment(linker, "/export:MemoryCopy=ntdll.RtlMoveMemory")
    void main()
    {
    int k=0;
    char chX[256];
    char chT[256];
    lstrcpyA(chT,"Hello");
    MemoryCopy(chX,chT,sizeof("Hello"));
    MessageBoxA(0,chX,"caption",0);
    }
     
  6. progstone

    progstone New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2007
    Сообщения:
    14
    сдирание crt memcpy 100% работает просто не могу понять почему все функции из ntdll/kernel32 импортаются рпямой переадресацией а эта не?
    напрмер
    #pragma comment(linker, "/export:MemoryCompare=NTDLL.RtlCompareMemory") пашет
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    я ж написал

    #pragma comment(linker, "/export:MemoryCopy=ntdll.RtlMoveMemory")

    должно пахать
     
  8. progstone

    progstone New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2007
    Сообщения:
    14
    RtlMoveMemory насколько помню тянет kernel32 из ntdll короче у меня в проекту не пашет
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    короче нафига тебе делать еще одну функцию memorycopy?
    не проще написать

    #pragma comment(lib, "ntdll")
    extern "C" void __stdcall RtlCopyMemory(PVOID, PVOID, DWORD);
    #define MemoryCopy RtlCopyMemory

    ?
     
  10. progstone

    progstone New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2007
    Сообщения:
    14
    не подскажишьь как ее в dll запихнуть а то вот
    extern "C" MEMORY_API WINAPI MemoryCopy(void* p,void* p,int size)
    ругается second "C" linkage
     
  11. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    what is MEMORY_API?
     
  12. progstone

    progstone New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2007
    Сообщения:
    14
    #pragma once
    #include <windows.h>
    #ifndef MEMORY_API
    #ifdef MEMORY_EXPORTS
    #define MEMORY_API __declspec(dllexport)
    #else
    #define MEMORY_API __declspec(dllimport)
    #endif
    #endif
     
  13. progstone

    progstone New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2007
    Сообщения:
    14
    это не тробл это скорее дело принципа , понять почему не работает
     
  14. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    MemoryCopy - это одна из "особенных" функций в последних версиях вижуальной студии и дело даже не в имени функции. В общем, тема уже обсуждалась - компилятор распознаёт код копирования массива байт и пытается его агрессивно оптимизировать (вставляет вызов какой-то функции из CRT), вопреки любым параметрам запрещающим своевольничать.
     
  15. progstone

    progstone New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2007
    Сообщения:
    14
    Quantum
    Понял на мой вопрос ответили.Тема для меня новая и интересная.Хотелось бы узнать и о других "оптимизациях"(ограничениях) на вижах.Если знаешь подкинь ссылку.
     
  16. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    progstone
    Гугл первой ссылкой выдал этот блог по теме известных багов в Visual C++:
    http://minimsft.blogspot.com/2005/11/hey-shareholders-vs-2005-is-fantastic.html
     
  17. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    как он может его распознать, если функция импортируется?
     
  18. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Nouzui
    Не должен, но распознаёт :)

    На самом деле эти функции (strlen, memcopy и т.п.) обьявлены в стандартных заголовках, но не факт, что компилятор "распознаёт" их именно на основании хидеров. Скорее всего, имена этих функций захардкодены в самом компиляторе.
     
  19. progstone

    progstone New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2007
    Сообщения:
    14
    Quantum
    Ходил я по http://minimsft.blogspot.com/2005/11/he … astic.html и другим ссылкам по поиску баг студии
    есть там пару интересных касающихся .NET(таковые всегда будут) остальные касаются самих IDE/install студии а это не особо интересно есть таковые и в 7.1.Я имел ввиду баги при кодинге
     
  20. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    progstone
    Не понял. В смысле багов/ограничений в поддержке стандарта C/C++? МС в этом плане и не претендует на пальму первенства.