Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C/C++][asembler] - Wyjątek przy próbie zapisu danych przez bibliotekę DLL

ravix666 23 Wrz 2012 16:08 1347 2
  • #1 23 Wrz 2012 16:08
    ravix666
    Poziom 2  

    Witam!
    Od kilku dni uczę się asemblera. Chciałem napisać bibliotekę DLL w asemblerze, która zamienia małe literki na duże, w podanym w argumencie łańcuchu(w ramach nauki). Funkcja biblioteczna otrzymuje w argumencie wskaźnik na łańcuch(char *). Odczyt poszczególnych znaków działa, problem występuje natomiast w momencie gdy chcę coś zapisać pod adresem przechowywanym we wskaźniku.
    W trybie Debug instrukcja asemblerowa powodująca wyjątek:
    MOV BYTE PTR[ebx], 97 ;a
    Treść wyjątku:
    Unhandled exception at 0x77a415de in MyDll.exe: 0xC0000005: Access violation writing location 0x01175778.
    Przypuszczam, że dll'ka nie ma uprawnień do zapisu, ale z godnie z materiałami na necie wszytko powinno działać. Pisałem wcześniej podobne biblioteki, ale z prostymi dodającymi, mnożącymi funkcjami i wszystko działało bez zarzutów.
    W trybie Release natomiast wykrywa bibliotekę dll, ale nie potrafi znaleźć funkcji bibliotecznej.
    Na razie biblioteka nie robi nic poza próbą zapisu literki pod wskazany adres.
    Używam Windowsa 7 i Visual Studio 2010
    Kod biblioteki DLL:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Kod aplikacji wykorzystującej bibliotekę:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    W załączniku dorzucam projekt w visual studio.Był bym wdzięczny za pomoc w znalezieniu problemu lub podaniu linka do materiałów związanych z tym zagadnieniem. Ewentualnie podrzucenie działającego exmplesa :D

    0 2
  • Pomocny post
    #2 23 Wrz 2012 16:48
    Akane
    Poziom 27  

    Witaj,

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Taki ciąg znaków zazwyczaj jest tylko do odczytu, zależnie od ustawień kompilatora. w VisualStudio jest to odpowiednik "const char*", w Masm to dane w segmencie ".const".
    Zmień go na
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    ewentualnie obejmij tekst w {}
    To jest pewien kompromis - tablice znaków w programie, a przynajmniej w jednym module (c,cpp) nie są duplikowane, ilekroć odwołasz się do takiego samego ciągu znaków. Gdyby można było je nadpisać, to jedna zmiana wywarłaby wpływ na wszystkie inne linie kodu, które odnoszą się do tego samego ciągu znaków i zmiana by była widoczna zewsząd.

    Nie znajduje funkcji - powinieneś wiedzieć, że języki bardziej skomplikowane, lub bardziej uniwersalne, bądź też dostosowane do innych języków (tutaj MASM jest dostosowany do języka C) wprowadzają dekoracje w nazewnictwie symboli. Masm domyślnie stosuje dekoracje wprowadzone w języku C - nazwa jest poprzedzona znakiem _ (jeżeli to cdecl/stdcall), a zakończona (jeżeli jest to funkcja stdcall/fastcall/thiscall) symbolem małpy oraz rozmiarem przyjmowanych argumentów, w bajtach.

    Twoja funkcja, od strony linkera, wygląda tak: _Edycja@4
    I dokładnie taki sam symbol jest wyeksportowany z dll. Taki ciąg znaków powinieneś podać do funkcji GetProcAddress.

    Zmian nazw, bzw. usunięcia dekoracji, dokonuje się zazwyczaj za pomocą tekstowego pliku .def, dołączanym do etapu linkowania.

    0
  • #3 23 Wrz 2012 18:30
    ravix666
    Poziom 2  

    Oba problemy rozwiązane. Wielkie dzięki za pomoc i wytłumaczenie problemu:D

    0