Экспортируемая функция символ имени искажение - PullRequest
3 голосов
/ 12 декабря 2010

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

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

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

Ответы [ 3 ]

5 голосов
/ 12 декабря 2010

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

4 голосов
/ 12 декабря 2010

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

EXETYPE NT

EXPORTS
    extension_load
    DllMain

У меня есть файл .def с именем dll.def.У меня есть функция, написанная как:

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

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

nameofdef.def

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

1 голос
/ 19 марта 2011

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

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

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

...