реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Портирование DLL на Linux, Принцип работы Windows DLL
amw
сообщение May 18 2007, 14:15
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Задача такая:
Есть: DLL для Windows в исходниках C++.
Нужно: shared lib для Linux с сохранением совместимости на уровне исходников приложений.

DLL использует активно OVERLAPPED IO, Notyfication, Event, Thread.
В Linux (кроме Thread) нет аналогов этому. Или есть? Тогда какие, что почитать?

Опыта программирования в Windows очень мало, потому и вопросы тупые:

После анализа кода появилось ощущение, что переменные в Windows DLL могут использоваться разными приложениями. В смысле одна и та же копия переменной доступна нескольким процессам. Это так?

В коментариях в исходниках есть фразы на подобие
"Отсылаем WM_MESSAGE всем процессам, использующим DLL что очередь изменилась."
Вопрос: Windows DLL является самостоятельной сущностью, типа процесса? А иначе как DLL может отослать что-то ВСЕМ процессам, ее использующим?

Прошу не пинать ногами и не посылат сразу в MSDN. Я его пытаюсь читать, но эти вопросы ставят меня в тупик.

Сообщение отредактировал amw - May 18 2007, 14:20


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
ms1
сообщение May 18 2007, 16:51
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 150
Регистрация: 13-10-05
Пользователь №: 9 614



Про линукс ничего не скажу.
А про Win DLL упрощенно:
Динамически линкованные код и данные после загрузки ДЛЛ ничем не отличаются от статически линкованных.

Цитата(amw @ May 18 2007, 18:15) *
После анализа кода появилось ощущение, что переменные в Windows DLL могут использоваться разными приложениями. В смысле одна и та же копия переменной доступна нескольким процессам. Это так?


"Обычные" данные принадлежат тому процессу в контексте которого работает ДЛЛ и соответственно имеется столько копий, сколько раз ДЛЛ загружена.
Однако можно разместить статические данные в shared сегменте, тогда такие данные всех экземпляров загруженных ДЛЛ будут отображатся на одну и туже область памяти.
Т.е. они будут доступны из всех процессов загрузивших эту ДЛЛ.
Правда это так не только для ДЛЛ.

Цитата
В коментариях в исходниках есть фразы на подобие
"Отсылаем WM_MESSAGE всем процессам, использующим DLL что очередь изменилась."
Вопрос: Windows DLL является самостоятельной сущностью, типа процесса? А иначе как DLL может отослать что-то ВСЕМ процессам, ее использующим?


Нет. ДЛЛ это часть процесса ее загрузившего.
Т.е. вызвали функцию из ДЛЛ - обратились к части кода который расположен в адресном пространстве вызывающего процесса.

А под той фразой видимо понимается, что текущий процесс может послать сообщения другим процессам, которые используют эту же ДЛЛ.
Чтобы понять как это может быть реализовано поRTFMте по ф-ции DllMain() и посмотрите на ее код в Вашем проекте.
Или по функции API RegisterWindowMessage().

Цитата
Прошу не пинать ногами и не посылат сразу в MSDN. Я его пытаюсь читать, но эти вопросы ставят меня в тупик.


Почитайте Рихтера "Windows для профессионалов" или хотя бы второй том Петзолда "Програмирование для Win95".
Go to the top of the page
 
+Quote Post
amw
сообщение May 18 2007, 17:41
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Спасибо!!!

А если DllMain выглядит так:
Код
BOOL APIENTRY DllMain( HINSTANCE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            hInstance = hModule;
            break;
        case DLL_THREAD_ATTACH:
            break;
        
        case DLL_THREAD_DETACH:
            break;

        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

какие можно сделать выводы в контексте моих вопросов?
shared сегменты как-то декларируются или есть отдельные функции для их запроса/выделения/использования?


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
ms1
сообщение May 18 2007, 19:02
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 150
Регистрация: 13-10-05
Пользователь №: 9 614



Цитата(amw @ May 18 2007, 21:41) *
А если DllMain выглядит так:
.....
какие можно сделать выводы в контексте моих вопросов?


В приведенном коде ничего нет "из такого".
Имелось ввиду что можно вести учет использующих данную ДЛЛ процессов, пользуясья DllMain().
Она вызывается при проецировании ДЛЛ в память процесса (попадаем в ветку case DLL_PROCESS_ATTACH:)
и при выгрузке (case DLL_PROCESS_DETACH:) когда процесс прекращает существование или явно выгружает ДЛЛ.

Цитата
shared сегменты как-то декларируются или есть отдельные функции для их запроса/выделения/использования?

Ну конечно. smile.gif
Например в компиляторе от MS это
#pragma data_seg
Плюс нужна соответствующая опция для линкера.

Сообщение отредактировал ms1 - May 18 2007, 19:07
Go to the top of the page
 
+Quote Post
Harbour
сообщение May 19 2007, 03:11
Сообщение #5


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



См. проекты типа xine - там написан раппер для вызова f() из dll, которые валяются в linux'е. Про wine я вообще молчу.
Go to the top of the page
 
+Quote Post
amw
сообщение May 19 2007, 08:48
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(ms1 @ May 18 2007, 22:02) *
В приведенном коде ничего нет "из такого".
Имелось ввиду что можно вести учет использующих данную ДЛЛ процессов, пользуясья DllMain().
Она вызывается при проецировании ДЛЛ в память процесса (попадаем в ветку case DLL_PROCESS_ATTACH:)
и при выгрузке (case DLL_PROCESS_DETACH:) когда процесс прекращает существование или явно выгружает ДЛЛ.
Ну конечно. smile.gif
Например в компиляторе от MS это
#pragma data_seg
Плюс нужна соответствующая опция для линкера.

Понял. Спасибо!!!
Пошел курить RTFM.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
scifi
сообщение May 19 2007, 13:57
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(amw @ May 18 2007, 18:15) *
Задача такая:
Есть: DLL для Windows в исходниках C++.
Нужно: shared lib для Linux с сохранением совместимости на уровне исходников приложений.

Насколько я знаю, Winelib придумана как раз для вашего случая.
Go to the top of the page
 
+Quote Post
amw
сообщение May 21 2007, 14:03
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(scifi @ May 19 2007, 16:57) *
Насколько я знаю, Winelib придумана как раз для вашего случая.

В моем случае исползование внешних библиотек крайне нежелательно.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
kaf
сообщение Jun 18 2007, 15:26
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 11-07-06
Из: Челябинск
Пользователь №: 18 726



Вам стоит посмотреть проект mplayer (http://www.mplayerhq.hu/). Там цепляются dll виндовские с кодеками.

Сообщение отредактировал kaf - Jun 18 2007, 15:27
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 11:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01443 секунд с 7
ELECTRONIX ©2004-2016