Изменение имени экспортированного функционального символа

У меня есть D DLL, которая загружается программой C++, которую я не могу контролировать. Программа LoadLibrary создает мою DLL и использует GetProcAddress для поиска функции с именем «extension_load», которая принимает один аргумент (указатель). В моей D DLL у меня есть:

extern (C) int extension_load(void* ptr) {
    return 0;
}

И это имя нужно экспортировать как extension_load, но оно экспортируется как extension_load@4, поэтому GetProcAddress не может его найти. Как мне сделать его простым extension_load без искажения имени?


person John Zane    schedule 12.12.2010    source источник
comment
И GetProcAddress не находит функцию? Откуда взялось extension_load@4 (т.е. как вы узнали, что это имя)?   -  person jpalecek    schedule 12.12.2010
comment
@jpalecek, извините, я думал, что это подразумевается. GetProcAddress не может найти функцию по имени extension_load. @4 исходит из длины в байтах всех аргументов, и я знаю, что extension_load@4 — это то, что экспортируется сейчас, потому что, если я открою процесс с помощью отладчика и изменю строку в памяти, чтобы она была extension_load@4, функция находится.   -  person John Zane    schedule 12.12.2010


Ответы (3)


Вам нужно будет предоставить компоновщику файл .def, который переименовывает экспорт. Документы здесь, вам нужен ЭКСПОРТ.

person Hans Passant    schedule 12.12.2010
comment
Я новичок в D и понятия не имею, как предоставить компоновщику файл .def, который переименовывает экспорт. Я даже не знаю параметров командной строки. - person John Zane; 12.12.2010
comment
Что ж, считайте, что это отличная возможность начать узнавать об этом больше. Ваш вопрос недостаточно подробен, чтобы я мог сказать, используете ли вы какую-то IDE или строите вручную. Просмотрите сайт, на который я ссылался, на нем также есть документы по компоновщику. - person Hans Passant; 12.12.2010

Я заработал с некоторой помощью по ссылке Ханса Пассанта. Вот мой файл .def для тех, кому он понадобится в будущем (вероятно, и мне тоже):

EXETYPE NT

EXPORTS
    extension_load
    DllMain

Файл .def, который у меня есть, называется dll.def. У меня есть функция, написанная как:

extern (C++) int extension_load(void* ptr) {

и среда IDE, которую я использую, это D-IDE, поэтому, чтобы предоставить компоновщику файл def, перейдите в «Проект»> «Свойства»> «Параметры сборки» и введите

nameofdef.def

в текстовом поле Дополнительные аргументы связывания. Это предполагает, что файл nameofdef.def существует в вашем основном каталоге проекта, чтобы его могла найти D-IDE.

person John Zane    schedule 12.12.2010

На самом деле нет необходимости в файле def. Просто добавьте свои функции с помощью export, например:

    export extern (C) int extension_load(void* ptr) {
    return 0;
}

И скомпилировать через: dmd -ofmydll.dll mydll.d. Конечно, вам также потребуется определить DllMain().

person Andrej Mitrović    schedule 19.03.2011