У меня многопоточное приложение, которое динамически загружает dlls (плагины). У меня есть потоки в DLL. Между хост-приложением и dll мой собственный SDK, который предназначен для обеспечения связи с плагинами dll (интерфейс библиотеки) и определения общих ресурсов между хост-приложением и dll (структурами данных и т. Д.).Использование таких же мьютексов в хост-приложении и dll
Хост-приложение создает объект mutex с помощью функции CreateMutex с помощью функции WinAPI и передает THandle созданного мьютекса для каждой загружаемой DLL. Когда поток в DLL меняет общие ресурсы, он использует мьютекс для его защиты. Как я уже сказал, я использую WinAPI.Windows unit для вызова CreateMutex и всех других связанных с mutex функций (Release и т. Д.).
Идея состоит в том, чтобы сделать кросс-платформу SDK, поэтому я собираюсь изменить SDK, и я хотел бы избавиться от единицы WinAPI.Windows и всех связанных с Windows материалов.
Я включил System.SyncObjs для использования класса TMutex. Теперь я не совсем уверен, как бы я узнал, что моя dll об этом классе. Один из вариантов - передать TMutex в мою DLL, но я думаю, что это не вариант, если я хочу сохранить типы данных primitve в своем SDK, потому что SDK должен быть доступен для других языков, таких как C++, C# ... и т. Д. Другая идея, которая пересекает мой ум должен использовать именованные мьютексы и просто передавать имя (строку) в DLL.
Согласно MSDN: Если мьютекс именованный мьютекс и объект существовал до этого вызова функции, возвращаемое значение является дескриптор существующего объекта, GetLastError возвращает ERROR_ALREADY_EXISTS, bInitialOwner игнорируется, и вызывающий поток не предоставил право собственности. Однако, если у вызывающего есть ограниченные права доступа, функция будет терпеть неудачу с ERROR_ACCESS_DENIED, и вызывающий должен использовать функцию OpenMutex.
Таким образом, я предполагаю, что DLL сможет использовать существующие именованные мьютексы (MyMutex), когда он вызовет TMutex.Create (..., 'MyMutex').
Я прав?
Благодарим за помощь и ваши предложения. Я очень ценю это!
Вы не можете передать объект Delphi из exe в dll или наоборот. Вам нужно будет использовать типы платформ. Вместо того, чтобы передавать мьютексы, лучше использовать именованные мьютексы. –
Вы * можете * передать объект Delphi, если оба exe и dll скомпилированы с включенными пакетами времени выполнения. Тем не менее, я бы придерживался только проходящей «THandle». Или лучше, «Pointer», и пусть exe/dll придумает это при необходимости. Написание кросс-платформенного кода не означает уничтожения устройства 'Windows'. Вы можете 'IFDEF', чтобы он использовался только на платформах Windows. Кросс-платформенный код в конечном итоге должен использовать API-интерфейсы, специфичные для платформы, они просто скрыты от общедоступных интерфейсов. –
@Remy Вы можете сделать это только в том случае, если используете ту же самую версию компилятора. Недостаточно просто включить пакеты времени выполнения. Более того, вы можете передавать объекты, полностью определенные в пакетах. Вы не можете иметь типы, объявленные в exe или dll. –