2008-10-29 3 views
1

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

В широком смысле, что у меня есть это:

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-файлов. Если я опускаю то, что облегчит ответ на вопрос, прокомментируйте, и я обнов его как можно скорее.

ответ

1

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

В shared_library.c:

__declspec(dllexport) int __stdcall shared_library_method(void) 
{ 


} 

MSDN article об экспорте функции из DLL: с.

+0

Я должен был включить это; мои объявления в общей библиотеке имеют это. Обновлено в сообщении. – 2008-10-29 17:14:57

2

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

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

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

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

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

1

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

/export:[email protected] 

Это должно получить вас Lib-файл, который вы строите с DLL.

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

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