Сейчас на форуме: asfa (+6 невидимых) |
eXeL@B —› Вопросы новичков —› Явное связывание |
Посл.ответ | Сообщение |
|
Создано: 13 декабря 2013 18:34 · Личное сообщение · #1 В VS C++ пытался явно вызвать функцию MyFunc из DLL, используя GetProcAddress(hDll,"MyFunc"). Не получается, т.к. компилятор дописывает к имени подчеркивание и хвост. Возможно ли нейтрализовать это так называемое манглирование, не трогая DLL. Через dllexp.exe хорошо видно в DLL неискаженное имя MyFunc, кроме того, если в GetProcAddress заменить имя на вызов по её ординалу, то происходит нормальный вызов. Также при неявном связывании в VS C++ работает и имя этой функции. Используется код СРР в программе. На ассемблере, насколько помнится, этой закавыки не возникает. |
|
Создано: 13 декабря 2013 18:49 · Поправил: reversecode · Личное сообщение · #2 |
|
Создано: 13 декабря 2013 19:11 · Личное сообщение · #3 |
|
Создано: 13 декабря 2013 19:24 · Личное сообщение · #4 |
|
Создано: 13 декабря 2013 23:07 · Личное сообщение · #5 |
|
Создано: 14 декабря 2013 14:10 · Личное сообщение · #6 reversecode и др. Посмотрел я ссылку - там перечисляются соглашения по вызову. У меня в программе используется __stdcall, и как показывает dllexp, то же самое в DLL. Да, до стека дело ещё не доходит. Я пишу в GetProcAddress "MyFunc", а как видно в OllyDbg, в параметрах GetProcAdress появляется "_MyFunc@1". Вот эти приписки и мешают. |
|
Создано: 14 декабря 2013 14:15 · Поправил: reversecode · Личное сообщение · #7 |
|
Создано: 14 декабря 2013 14:35 · Личное сообщение · #8 |
|
Создано: 14 декабря 2013 18:45 · Личное сообщение · #9 Проверил ваши предложения. Когда в программе задал вызов в виде "_MyFunc@1", в дизассемблированном коде - это же "_MyFunc@1" и вызова функции нет. Посмотрел в Far'e эту DLL. Там в отличие от того, что показывает dllexp, искаженное (манглированное ) имя "?MyFunc@@YZXXZ". Задав его в программе - функция вызвалась! То есть при создании DLL с намерением явной загрузки функций надо изменять экспортируемые имена, что, наверное, выполняет def-файл, Опять надо что-то делать!! Спасибо за предложения! |
|
Создано: 14 декабря 2013 18:48 · Поправил: reversecode · Личное сообщение · #10 ksol пишет: То есть при создании DLL с намерением явной загрузки функций надо изменять экспортируемые имена, что, наверное, выполняет def-файл, Опять надо что-то делать!! reversecode пишет: конвершин колл влияют как раз на создание мангл имени reversecode пишет: и добавте еще extern "C" rmn внимательнее читаем, то на что я отвечаю а def файлом можно только перемапить но для правильности для этого делают .h файл который подключают а не тупо функции по именам вызывают где в конверш-кол можно пролететь |
|
Создано: 14 декабря 2013 19:10 · Личное сообщение · #11 |
|
Создано: 16 декабря 2013 18:48 · Личное сообщение · #12 |
|
Создано: 16 декабря 2013 19:32 · Личное сообщение · #13 |
|
Создано: 17 декабря 2013 18:56 · Личное сообщение · #14 rmn Спасибо! Так я и сделал: Code:
И получил, что мне и требовалось: Code:
Но, созданная таким способом DLL на ура не заработает при неявном связывании! |
|
Создано: 17 декабря 2013 21:06 · Личное сообщение · #15 |
|
Создано: 17 декабря 2013 21:30 · Личное сообщение · #16 |
|
Создано: 18 декабря 2013 16:49 · Личное сообщение · #17 rmn А я и не думал, что так можно! Поэтому запустил, изменив соглашение: Code:
|
|
Создано: 18 декабря 2013 16:51 · Личное сообщение · #18 |
|
Создано: 18 декабря 2013 17:00 · Личное сообщение · #19 |
eXeL@B —› Вопросы новичков —› Явное связывание |
Эта тема закрыта. Ответы больше не принимаются. |