Как я могу контролировать, какие символы Windows DLL импортирует из приложения? - PullRequest
1 голос
/ 29 октября 2008

Я пытаюсь создать общую библиотеку (DLL) в Windows, используя MSVC 6 (ретро!), И у меня возникла особая проблема со ссылками, которую мне нужно решить. Моя общая библиотека должна иметь доступ к некоторому глобальному состоянию, контролируемому загрузкой приложения.

В общем, у меня есть вот что:

application.c:

static int g_private_value;

int use_private_value() {
    /* do something with g_private_value */
}

int main (...) {
    return shared_library_method ();
}

shared_library.c:

__declspec(dllexport) int __stdcall shared_library_method() {
    use_private_value();
}

( Обновлено - я забыл часть __declspec(dllexport) int __stdcall, но она есть в реальном коде)

Как настроить файл shared_library.dll, чтобы он экспортировал shared_library_method и импортировал use_private_value?

Пожалуйста, помните, что A) я вообще программист Unix, и B) что я делаю это без Visual Studio; наша автоматизированная инфраструктура сборки поддерживает MSVC с помощью make-файлов. Если я опущу что-то, что облегчит ответ на вопрос, пожалуйста, прокомментируйте, и я обновлю это как можно скорее.

Ответы [ 3 ]

2 голосов
/ 29 октября 2008

На самом деле это будет довольно сложно заставить работать. В Unix / Linux у вас могут быть общие объекты и приложения, импортирующие символы друг от друга, но в Windows вы не можете иметь символы импорта DLL из приложения, которое его загружает: исполняемый формат Windows PE просто не поддерживает эту идиому.

Я знаю, что у проекта Cygwin есть какой-то обходной путь для решения этой проблемы, но я не верю, что это тривиально. Если вы не хотите заниматься хакерством, связанным с физическими упражнениями, вы, вероятно, не захотите туда идти.

Более простым решением может быть просто экспортировать какой-либо метод инициализатора из DLL:

typedef int (*func_ptr)();
void init_library(func_ptr func);

Приложение должно вызывать это при запуске, передавая адрес функции, которой вы хотите поделиться. Не совсем элегантно, но должно работать нормально.

1 голос
/ 29 октября 2008

Для второй половины вам нужно экспортировать функции из вашего application.c. Вы можете сделать это в компоновщике с помощью:

/export:use_private_value@0

Это должно дать вам lib-файл, который вы создаете с помощью вашей DLL.

Возможность связать lib-файл - использовать GetProcAddress ().

Как заметил DavidK, если у вас есть только несколько функций, вероятно, легче передать указатели функций в функцию init. Однако возможно сделать то, что вы просите.

1 голос
/ 29 октября 2008

Я начну с половины ответа.

В shared_library.c:

__declspec(dllexport) int __stdcall shared_library_method(void)
{


}

Статья MSDN об экспорте функции из DLL: s.

...