Tester egii, biblioteki DLL i FreeLibrary ()
Pokaż wyniki od 1 do 2 z 2

Wątek: Tester egii, biblioteki DLL i FreeLibrary ()

  1. #1
    Widziałem ten problem wspomniany tu i tam, szczególnie przez 7bit, ale nigdy nie udało mi się obejść tego problemu:

    Tester egy nie odpowiednio zmniejsza liczbę odwołań załadowanej biblioteki podczas deinit (). Z tego powodu plik DLL pozostaje załadowany do systemu i ulega awarii podczas próby ponownego uruchomienia testera.

    Próbowałem użyć GetModuleHandle () i FreeLibrary (), ale to nie rozwiązało problemu.

    Wstawiony kod, jeśli (IsTesting ()) {int dll_handle = DLLHandle (C: \ Program Files (x86) \ MT \ experts \ libraries \ SQLBridgeV2.dll); Drukuj (dll_handle); if (dll_handlegt; 0) FreeLibrary (dll_handle); } KOREKTA:
    dll_handle zwraca liczbę inną niż 0, a FreeLibrary ją zmniejsza.

    Jeśli ponownie sprawdzę funkcję GetModuleHandle (), otrzymam 0 - co powinno oznaczać, że biblioteka jest rozładowana.

    Jednak jeśli ponownie uruchomię tester, nadal się zawiesza.

    Jest to dość denerwujące, ponieważ nie mogę korzystać z funkcji optymalizacji.

    Co dokładnie się dzieje? Czy globalne zmienne DLL są inicjowane i zanieczyszczone danymi z ostatniego testu? Czy wystąpił błąd podczas próby zainicjowania biblioteki DLL przez już zainicjowaną bibliotekę DLL?

  2. #2

    Cytat Zamieszczone przez ;
    Jednak jeśli ponownie uruchomię tester, nadal się zawiesza. Jest to dość denerwujące, ponieważ nie mogę korzystać z funkcji optymalizacji. Co dokładnie się dzieje? Czy globalne zmienne DLL są inicjowane i zanieczyszczone danymi z ostatniego testu? Czy wystąpił błąd podczas próby zainicjowania biblioteki DLL przez już zainicjowaną bibliotekę DLL?
    Wskazuje to na problemy w Twojej bibliotece DLL. Nie jest to prawidłowe niszczeniezwalnianie całej pamięciobiektów lub - co bardziej prawdopodobne, że powoduje awarię - w pewnym momencie podczas reinicjowania przy drugiej próbie użycia wskaźnika lub odniesienia do czegoś, co już nie istnieje. Nie można dokładnie powiedzieć, co to jest bez patrzenia na DLL. Ale musisz: 1) zwrócić uwagę na initdeint twojej biblioteki DLL 2) Funkcja DLL_entry_point () nie będzie wywoływana po raz drugi, ponieważ biblioteka DLL nie została rozładowana, więc DONT USE IT. Umieść kod z tego miejsca w funkcji, którą wywołasz z MT4, aby zainicjować bibliotekę DLL. 3) upewnij się, że każda pamięćobiekty utworzone poza rutynem init są traktowane podczas Deinit Spróbuj zmodyfikować twój DLL initdeint w sposób zbliżony do poniższego: Wstawiony kod Global vars objptr: pointer = nil;/wskaźnik obiektu zainicjalizowany do nil memptr: pointer = nil; func DLL_INIT ()/wywoływane przez ciebie z MT4 init () {if (objptr == zero) objptr = somobject.create ();/create object} func DLL_some rutynowe ()/wywoływane przez ciebie z mt4 gdzieś w EA {memptr = getmem (przypadek);/zrób coś z pamięcią ... nie zwalniamy pamięci/na końcu tej funkcji! } func DLL_Deint ()/wywoływana przez ciebie z mt4 deinit () {if (objptr! = nil) {objptrfree; objptr = nil; } if (memptr! = nil) {freemem (memptr, somememory); memptr = nil; }} Jeśli utworzyszalloe całą swoją pamięćobjsdynamiczne vars w ten sposób, powinieneś unikać odwoływania się do czegoś, co nie istnieje.

Uprawnienia umieszczania postów

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Używamy cookies
Używamy cookies, aby jak najlepiej dostosować witrynę do Twoich potrzeb. Kontynuowanie przeglądania tej strony, oznacza zgodę na używanie plików cookies. Aby uzyskać więcej informacji zapoznaj się z naszą Polityką Prywatności.