Привет всем У меня такой вопрос: Есть dll, которая имеет экспортную функцию с таким именем: ??1INIFile@@QAE@XZ Я хочу создать новую dll на masm32 с такой же функцией, но не знаю, как её правильно назвать В emul.def пишу: ~...~ EXPORTS ??1INIFile@@QAE@XZ ~...~ В emul.asm: ~...~ ??1INIFile@@QAE@XZ proc STDCALL ret ??1INIFile@@QAE@XZ endp ~...~ Пытаюсь скомпилировать, пишет "error LNK2001: unresolved external symbol "public: __thiscall INIFile::~INIFile(void)" (??1INIFile@@QAE@XZ)" Подскажите, как объявить эту функцию, чтобы новая dll-ка скомпилировалась нормально и при этом функция имела имя ??1INIFile@@QAE@XZ Пробовал делать так: В emul.def пишу: ~...~ EXPORTS ??1INIFile@@QAE@XZ = inifile ~...~ В emul.asm: ~...~ inifile proc STDCALL ret inifile endp ~...~ Компилится нормально, НО имя функции выглядит так: ??1INIFile Компилятор зачем-то обрезает имя до символа "@"
попробуй так: забей место каким-нибудь словом по размеру ??1INIFile@@QAE@XZ, а потом в 16чном редакторе подправишь или ещё в какой-нить утилите
GoldFinch В фасме скомпилилось нормально, но я не умею в нём работать и не смог найти для него нормальной справочной системы по встроенным функциям, как в масме, а кода разного там будет немало kernel16 Не хотелось прибегать к такому неудобному решению, но, видимо, выбора нет, придётся заменить символы "@" какими-нибудь другими символами, а после компиляции тупо пропатчить
qweasd А ты не забыл объявить прототип в файле emul.asm?: ??1INIFile@@QAE@XZ PROTO STDCALL Компилится то нормально, но символ ??1INIFile@@QAE@XZ не объявлен как внешний (PROTO как раз делает это), вот линкер его и не видит.
LShadow77 Конечно, объявил (просто здесь не написал) Компилится только в одном случае - когда меняю имя функции в .def (про это в первом сообщении), но и то имя получается не полностью
qweasd Ошиблись, надо писать так. Код (Text): EXPORTS ??1INIFile@@QAE@XZ = _inifile@0 Если конечно inifile с нулевым кол-вом параметров. З.Ы При неверном имени, линковщик походу считает символ @ за признак ординала, или что-то в этом духе и обрезает псевдоним. ^)
для масма: сотри stdcall в директиве model а во всех прототипах добавь это даст возможность управлять манглингом я про это писал, но щас не нашел
Booster Та же самая ошибка Rockphorr Если удалить stdcall из строки .model, выдаёт кучу ошибок: error A2119: language type must be specified
Booster При компиляции библиотеки. Я думаю, можно закрыть тему. Длл-ку я собрал, после чего имена экспортных фунок пропатчил на нужные. Всё работает. Единственное, что неудобно, - приходится патчить экспорт после каждой компиляции.
Asterix если уж на то пошло, то можно было б уже воспользоваться другим компилятором или линкером. например, попробовать расшифровать это С++ имя и заглушку написать на С++ ов позволяет вручную манглить имена, а линкер его позволяет во время линковки переименовывать экспорт. тот же фасм, вроде, не делает предположений насчет имен
qweasd в прототипах добавили stdcall ??? нет конечно - именно про это вам и говорит компилятор - error A2119: language type must be specified
qweasd Да блин, какая ещё ошибка? Код (Text): EXPORTS ??1INIFile@@QAE@XZ = _inifile@0 ~...~ В emul.asm: ~...~ inifile proc STDCALL ret inifile endp ~...~ Всё отлично собирается и имя именно - ??1INIFile@@QAE@XZ