Инициализация пространств имен из .SO (.DLL) не работает, когда библиотека загружена из приложения, отличного от CygnWin - PullRequest
0 голосов
/ 15 октября 2019

Мы пытаемся подключить скомпилированную библиотеку p7ZIP (.SO / .DLL) как .DLL и использовать ее в приложении Windows. Мы не хотим использовать оригинальную 7Z.DLL, так как мы хотим создать кроссплатформенное приложение, которое будет использовать эту библиотеку по умолчанию, но мы хотим разрабатывать на Win32.

Так что нам удалось скомпилировать эту библиотеку с помощью CygnWin32или MSys2-32. Client7z, скомпилированный cygnwin32 или MSys32-32, работает нормально и правильно использует эту библиотеку.

Мы создали простое приложение C ++ Builder, которое сначала выполняет LoadLibrary для загрузки DLL. Dll загружается нормально. Затем мы хотим проверить состояние глобальной переменной g_NumArcs, которая возвращает 0 в нашем C ++ Builder EXE, но возвращает 53 (как и должно быть) в Cygnwin 32.

Библиотека имеет много пространств имен, например, одно в 7zRegister.cpp, которое выполняет некоторыеинициализация при запуске. Похоже, этот код не запускается, когда DLL загружается из NON-CYGNWIN EXE. Работает нормально при загрузке из CYGWIN или MSYS32 EXE. Инициализация этих пространств имен устанавливает глобальную переменную g_NumArc.

Namespace NArchive {
namespace N7z {

static Byte k_Signature_Dec[kSignatureSize] = {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C};

REGISTER_ARC_IO_DECREMENT_SIG(
  "7z", "7z", NULL, 7,
  k_Signature_Dec,
  0,
  NArcInfoFlags::kFindSignature,
  NULL);
}
}

Так что может быть проблема, почему эти пространства имен инициализируются и макросы в нижней части запускаются во время загрузки из Cygnwin или MSys32 EXE, но не изнапример, Visual C ++, C ++ Builder или Delphi EXE?

...