Указатель на функцию..
Если динамически подгрузить DLL, а потом из EXE передать в эту DLL указатель на функцию, и вызвать эту функцию... такая штука будет работать?
И какие тут возможны проблемы?
Доброго времени суток, многоуважаемые...
Если динамически подгрузить DLL, а потом из EXE передать в эту DLL указатель на функцию, и вызвать эту функцию... такая штука будет работать?
И какие тут возможны проблемы?
В принципе должно работать
В принципе должно работать
А теоритически нет :D Все дело в адресном пространстве. Насколько я помню длл имеет свое адресное пространство. Или нет? Если да, то работать не должно, т.к. указатель на функцию будет попадать в молоко :). Если нет, то работать может, но я уверен в первом варианте.
А теоритически нет :D Все дело в адресном пространстве. Насколько я помню длл имеет свое адресное пространство. Или нет? Если да, то работать не должно, т.к. указатель на функцию будет попадать в молоко :). Если нет, то работать может, но я уверен в первом варианте.
и если это так, то как это обойти?
по идее на асме так call дальний должен быть?..
А теоритически нет :D Все дело в адресном пространстве. Насколько я помню длл имеет свое адресное пространство. Или нет? Если да, то работать не должно, т.к. указатель на функцию будет попадать в молоко :). Если нет, то работать может, но я уверен в первом варианте.
Или НЕТ!
"Адресное пространство" - это единственное словосочетание, которое ты знаешь?
Ты его употребляешь где ни попадя...
Ты молодец, что не уверен в том, что говоришь, но зачем же тогда говорить?
Доброго времени суток, многоуважаемые...
Если динамически подгрузить DLL, а потом из EXE передать в эту DLL указатель на функцию, и вызвать эту функцию... такая штука будет работать?
И какие тут возможны проблемы?
Такая штука работать будет. Даже больше того, ты можешь объявить некоторые методы в EXE, как __declspec(dllexport) и импортировать их в DLL, например, с помошью GetProcAddress.
Проблемы могут возникнуть в свзи с тем, что EXE и DLL (каждая) имеют свои менеджеры памяти, поэтому объекты созданные и память выделенная в одном модуле не должна удалятся в другом. При этом на использование этой области или объекта (как частный случай) ограничений не накладывается, т.е. можешь читать, писать свободно.
А теоритически нет :D Все дело в адресном пространстве. Насколько я помню длл имеет свое адресное пространство. Или нет? Если да, то работать не должно, т.к. указатель на функцию будет попадать в молоко :). Если нет, то работать может, но я уверен в первом варианте.
DLL имеет адресное пространство процесса, который ее вызвал
DLL имеет адресное пространство процесса, который ее вызвал
т.е.....? :x
т.е.....? :x
что т.е....?
каждый процесс действительно имеет свое ад. пр. При загрузке dll использует ту же область ОЗУ, что и процесс, который ее вызвал.
Т.е. аргументы HardMix неправильны
что т.е....?
каждый процесс действительно имеет свое ад. пр. При загрузке dll использует ту же область ОЗУ, что и процесс, который ее вызвал.
Т.е. аргументы HardMix неправильны
Да, но это работает если мы вызываем CreateProcess, чего мы не делаем при подгрузке ДЛЛ.
2Green: А есть факты которые смогут доказать мою неправоту? :D Если есть - я изменю свое мнение. Но ты, имхо, сам до конца в моей неправоте не уверен. Я то в своей аргументации уверен, но уверять в этом других я не намерен. Пусть пробуют. А разных словосочетаний я знаю много: мокрые ежики, пушистая метла, зеленые глюки. Но их я использую по другим поводам :)
Да, но это работает если мы вызываем CreateProcess, чего мы не делаем при подгрузке ДЛЛ.
Этот бред я пропущу.
2Green: А есть факты которые смогут доказать мою неправоту? :D Если есть - я изменю свое мнение.
Приготовился менять своё мнение? Поехали!
Ты когда-нибудь использовал DLL? Ну, например, Win32 API?
Возьмем к примеру функцию MessageBox. Второй и третий параметры в ней - указатели. Вопрос: какой смыл их передовать, если у DLL другое адресное пространство? :D
Читаем Рихтера:
Если процесс загружает DLL, то ее код проецируется в его адресное пространство и она (DLL) при этом теряет почти всю свою индивидуальность: для потоков код и данные DLL - просто дополнительный код и данные, оказавшиеся в адресном пространстве процесса. Когда поток вызывает из DLL какую-то функцию, та считывает свои параметры из стека потока и размещает в этом стеке собственные локальные переменные. Кроме того, любые созданные кодом DLL объекты принадлежат вызывающему потоку или процессу - DLL в Win32 ничем не владеет.
Но ты, имхо, сам до конца в моей неправоте не уверен.
Я говорю то, в чем уверен.
Я то в своей аргументации уверен, но уверять в этом других я не намерен.
А ты попробуй. Я свои доводы привел, дело за тобой.