как выгрузить dll - страница 5

 
TheXpert >>:

1-й вопрос на засыпку -- как система узнает из каких процессов выгружать дллку?

2-й вопрос на засыпку -- как без загрузки дллки найти точку входа в оной?


Теперь по существу. Дллка закружается и выгружается в процессе regsvr для корректной регистрации. И естественно это никак не сказывается на выгрузке ее из других процессов.

Не пытайтесь казаться глупее, чем вы есть. Хотя один плюс все же есть -- маны читать вы можете.

Это очевидно. Кроме выгрузки дллки в имплементации деинициализации индикатора (эксперта) может быть что угодно, непосредственно с этим связанное, что переводит самовольное освобождение дллки в разряд хаков, что в свою очередь не гарантирует корректной работы терминала.


Итого -- доказать, что вы не верблюд, вам уже не удастся, удачи, пыжьтесь дальше.

2All: не вздумайте его в админы взять.

А? Что?

Кто-нибудь, кто понял, переведите, плиз, сие на человеческий язык.

(нет, я ранее ошибся, TheExpert не может быть сотрудником такой компании как MetaQuotes, просто один мой ответ ему больно шибко быстро удалили).

 
AlexEro >>:
Дядя хакер, в Ваших словах нет никакой логики: если библиотека САМА и ВСЕГДА выгружается, то почему "мой" вызов FreeLibrary по Вашим словам "не будет работать во многих случаях"? Какой может быть вред от лишнего вызова FreeLibrary в блоке deinit()? Может, вызов FreeLibrary() по-Вашему как-то заблокирует освобождение библиотеки, что-ли? Неувязочка, дядя кул хацкер, причём явная.

Это не сложно понять. Если dll сама не выгружается как положено - значит у вас кривые руки и вы совершили ошибку в коде dll, (и скорее всего в DllMain, или замаскированные эксапшены). Это единственная причина, других просто нет, так как и Виндовс и терминал предельно лояльны к dll. Теперь о FreeLibrary, которую разработчики MT4 спрятали от шаловливых ручек самонадеянных админов. Если код dll корректен - то вызов этой функции не нужен, и это кстати можно понять из документации к терминалу, так как всё само собой выгружается. Но если код ошибочен, как в вашем случае, то FreeLibrary может вызвать deadlock, и\или вызвать сбой в терминале. Обращаю внимание, FreeLibrary не гарантирует выгрузку в случае ошибочных ситуаций. Иногда FreeLibrary может помочь, а иногда наоборот, может ухудшить ситуацию. Это лотарея, по этому, в данном случае, пользоваться этой функцией нерекомендуется. А рекомендуется писать грамотный код. Конечно, если вы сделать этого не в состоянии, то вашей dll уже мало что поможет. Так то.


Собственно говоря, об этом уже много раз тут было сказано, может быть действительно перестанете прикидываться очередным форумным дурачком.

 
HideYourRichess >>:

Это не сложно понять. Если dll сама не выгружается как положено - значит у вас кривые руки и вы совершили ошибку в коде dll, (и скорее всего в DllMain, или замаскированные эксапшены). Это единственная причина, других просто нет, так как и Виндовс и терминал предельно лояльны к dll. Теперь о FreeLibrary, которую разработчики MT4 спрятали от шаловливых ручек самонадеянных админов. Если код dll корректен - то вызов этой функции не нужен, и это кстати можно понять из документации к терминалу, так как всё само собой выгружается. Но если код ошибочен, как в вашем случае, то FreeLibrary может вызвать deadlock, и\или вызвать сбой в терминале. Обращаю внимание, FreeLibrary не гарантирует выгрузку в случае ошибочных ситуаций. Иногда FreeLibrary может помочь, а иногда наоборот, может ухудшить ситуацию. Это лотарея, по этому, в данном случае, пользоваться этой функцией нерекомендуется. А рекомендуется писать грамотный код. Конечно, если вы сделать этого не в состоянии, то вашей dll уже мало что поможет. Так то.


Собственно говоря, об этом уже много раз тут было сказано, может быть действительно перестанете прикидываться очередным форумным дурачком.

Дядя хацкер, обычно в такой момент ужЕ принято (даже в больших междугородных компаниях) спрашивать "чё вы там курите?", но я спрошу более вежливо:

Дядя хакёр, Вы читали рассказ Марка Твена "Как я редактировал сельскохозяйственную газету"? Читали? Там редактор газеты пишет о сборе брюквы с деревьев, не зная что такое брюква.

 

Да ладно, это то же дешевый трюк, пытаться "привлечь" на свою сторону "авторитетов" типа Марка Твена.


Признайтесь лучше, что в принципе не понимаете что такое dll и как оно функционирует.


Что тут непонятно то? вы плохой админ и плохой написатель dll?

 
HideYourRichess >>:

Да ладно, это то же дешевый трюк, пытаться "привлечь" на свою сторону "авторитетов" типа Марка Твена.


Признайтесь лучше, что в принципе не понимаете что такое dll и как оно функционирует.


Ах вот как? Да, но дядя хацкер, этого даже сама Микрософт не знает и/или не знает как разрулить! Это среди профи так и называется "DLL HELL". Не слыхали? Вот ссылка из википедии:

https://en.wikipedia.org/wiki/Dll_hell

там в конце ещё куча ссылок, в том числе из Микрософт.

Мне приятно осознавать, дядя, что на этом форуме я виртуально познакомился с ТАКИМ человеком, который ЗНАЕТ как это всё работает и как это всё разруливать.

 

Dll Hell - это старая хорошо известная проблема, и пути решения её, на пользовательском уровне, хорошо известны.


Но попробуйте объяснить, как эта проблема относится в терминалу?


Есть у меня подозрения, что вы пробежали глазами эту вики но так и не поняли суть проблемы. На всякий случай напомню: "Сущность проблемы заключается в конфликте версий DLL, призванных поддерживать определённые функции. DLL hell — пример плохой концепции программирования, которая, подобно скрытой мине, приводит к резкому возрастанию трудностей при усложнении и совершенствовании системы." (я взял описание из русской вики, так как за нашей дискуссией следят русские люди).


Итак, каким образом Dll Hell относится к терминалу? и ещё, как против этой проблемы поможет regsvr32 или FreeLibrary?

 
HideYourRichess >>:

Dll Hell - это старая хорошо известная проблема, и пути решения её, на пользовательском уровне, хорошо известны.


Но попробуйте объяснить, как эта проблема относится в терминалу?


Есть у меня подозрения, что вы пробежали глазами эту вики но так и не поняли суть проблемы.


Итак, каким образом Dll Hell относится к терминалу? и ещё, как против этой проблемы поможет regsvr32 или FreeLibrary?

Опять общие фразы и никакой конкретики, одно злопыхательство. DLL Hell не относится напрямую к проблеме, оно относится только к Вашему заявлению о том, что Вам в DLL всё известно, что там никаких проблем нет и что все, кто не дураки путём вдумчивого изучения какой-то там так и неназванной Вами доки может избежать ЛЮБЫХ проблем с DLL. На остальные вопросы по указанной проблеме я ответил, с цитатами и со ссылками. В отличие от Вас.

 
AlexEro >>:

Опять общие фразы и никакой конкретики, одно злопыхательство. DLL Hell не относится напрямую к проблеме, оно относится только к Вашему заявлению о том, что Вам в DLL всё известно, что там никаких проблем нет и что все, кто не дураки путём вдумчивого изучения какой-то там так и неназванной Вами доки может избежать ЛЮБЫХ проблем с DLL. На остальные вопросы по указанной проблеме я ответил, с цитатами и со ссылками. В отличие от Вас.

Вы обидились?! Перестаньте, берите пример с меня, я же не обращаю внимание на ваши мелкие дешевые попытки унизить собеседника.


А в dll действительно нет ничего сложного, если знать на какие грабли не следует наступать, особенно это просто в той реализации которую предлагают мегаквоты.


Вы не хотите признать, что единственный путь избежать проблем с dll - это грамотно написать эту самую dll, - это глупо. Какие вам тут нужны ссылки - понять невозможно.

 

По моему личному опыту, проблем с динамическими библиотеками нет (при написании на delphi и c++). У меня они сразу же освобождались после отключения индикаторов, которые их использовали. Быстрое отключение индикатора + замена dll всегда удавались.

FreeLibrary использовать я бы не стал лишь потому, что мой код _не_ вызывает LoadLibrary в явном виде - исправлять чужие ошибки я не собираюсь (если они воспроизводимы и не связаны с моим кодом - проще сообщить разработчикам).

Меня берут большие сомнения насчет того, что обсуждаемая проблема есть результат неправильной работы стороннего кода (windows или mt).

 

Желаю всем здравствовать!

Тема заинтересовала и решил проверить обсуждаемую тему на простом примере, который идет вместе с терминалом(проект DLLSample).

После компиляции в VS 6.0, испеченная dll работает с терминалом успешно, но сама не выгружается!

Вот основная функция:

BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  {
//----
   switch(ul_reason_for_call)
     {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
         break;
     }
//----
   return(TRUE);
  }

А теперь вопрос к знатокам, которые действительно разбираются в том как устроена и работает dll под виндой и знают как её правильно скомпелить в проекте под VS 6.0(к примеру).

Правильно ли выбран прототип основной функции?

Каким образом управлять потоками ATTACH/DETACH?

Где почитать об этом и желательно бы с примерами?