Как конвертировать библиотеку C ++ для использования в UWP? - PullRequest
0 голосов
/ 25 сентября 2019

Итак, у меня есть плата под управлением Windows 10 IoT и использующая для нее приложение UWP.У меня есть драйверы для конкретного ввода-вывода платы, работающие на плате, но теперь я хочу использовать предоставленную библиотеку для доступа и использования этого ввода-вывода.Если вы хотите также увидеть предоставленную библиотеку, найдите ее здесь (https://www.rtd.com/software/CM/CR/aDIO_windows_v05.04.00.zip)

Поскольку я более знаком с простым добавлением DLL-файла в качестве справочного материала и продолжением моего пути, я попробовал это в первую очередь.Возникла ошибка в компонентах COM или что-то в этом роде. Поэтому я связался с производителем платы относительно того, как мне следует приступить к установке этой библиотеки. Они отправили меня на эту страницу (https://docs.microsoft.com/en-us/cpp/porting/how-to-use-existing-cpp-code-in-a-universal-windows-platform-app?view=vs-2019#targetText=Porting%20a%20C%2B%2B%20Library%20to%20a%20Windows%20Runtime%20Component&targetText=You%20can%20use%20it%20in,app%20code%2C%20regardless%20of%20language), что имеет смысл, поскольку драйверы находятся в библиотеке c ++.

Я следовал Чтобы перенести собственную DLL в UWP без создания нового раздела проекта . Я добрался до шага 6 без проблем. При перестройке после шага 6 я получил ошибкупоговорка Использование статической версии библиотеки времени исполнения C ++ не поддерживает (http://prntscr.com/pazh69). Обыскал ее и сказал, что мне нужно изменить дополнительную настройку.

Так что я сделал Right-Нажмите «Проект»> «Свойства»> «C / C ++»> «Генерация кода» и переключите библиотеку «RunTime» на «/ MDd». Это, похоже, устранило эту ошибку. Попытка перестроить снова.

Далее я получилЭта проблема не позволяет использовать исходные файлы .c с флагом / ZW, который я включил ранее из руководства Microsoft.Поэтому я вошел в каждый из исходных файлов и убрал флаг / ZW только из них.

Наконец, снова перестроил и получил эту ошибку: http://prntscr.com/pazidr

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

Я предполагаю, что мой общий вопрос: 1Можно ли конвертировать эту библиотеку для использования в UWP?2. Является ли проблемой то, что исходные файлы являются файлами .c, а не файлами .cpp?3. Есть ли решение этой конкретной проблемы, позволяющее мне иметь работающую библиотеку UWP?4. Есть ли другой / лучший процесс для выполнения того, что я пытаюсь выполнить?

Заранее большое спасибо, я знаю, это здоровенный вопрос.

1 Ответ

3 голосов
/ 26 сентября 2019

Приложения UWP не поддерживают API-интерфейсы реестра и не могут их использовать.Вы должны удалить их при сборке для UWP.Рассмотрим что-то вроде:

#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) 
// Do stuff that calls Reg* APIs
#endif

Приложения UWP не используют CreateFile, что на самом деле делает много вещей помимо файловых операций.Если вы используете его для открытия файлов на диске, к которому у вас есть доступ как UWP, то вы можете использовать что-то вроде:

// Reading a file
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
   HANDLE file = CreateFile2(fileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr);
#else
   HANDLE file = CreateFileW(fileName, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
#endif

// Creating a file for writing
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
    HANDLE file = CreateFile2(fileName, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr);
#else
    HANDLE file = CreateFileW(fileName, GENERIC_WRITE | DELETE, 0, nullptr, CREATE_ALWAYS, 0, nullptr);
#endif

На вас по-прежнему распространяются ограничения доступа к файлам UWP.См. Права доступа к файлу

Если вы используете CreateFile для доступа к устройству, то это не поддерживается для приложений UWP.Существует несколько ограниченных сценариев, в которых вы можете получить доступ к драйверу устройства из UWP, но в любом случае вам нужно будет написать другую реализацию, используя API среды выполнения Windows.См. API доступа к устройству

...