Как использовать SQLite в WinRT DLL?

Я пытаюсь разработать DLL WinRT, которая использует SQLite для записи базы данных. Но похоже, что некоторые API-интерфейсы win32 в исходном коде SQLite не поддерживаются метро, ​​например, LoadLibraryW, GetTempPathA.

Есть ли способ скомпилировать исходный код SQLite или использовать SQLite с WinRT DLL?


person Greg    schedule 14.10.2011    source источник
comment
возможный дубликат Использование SQLite с WinRT   -  person dalle    schedule 14.10.2011
comment
@dalle: Кажется, что хотя названия похожи, описанные проблемы совершенно разные.   -  person Björn Pollex    schedule 14.10.2011
comment
@BjörnPollex: Правда, вопросы и описанные проблемы немного отличаются, но ответ остается тем же. Некоторые функции Win32 не разрешены при компиляции с помощью WinRT, например LoadLibraryW, GetTempPathA, CreateFileA, CreateFileW, DeleteFileA и т. д. Сложнее всего портировать, наверное, LoadLibraryW.   -  person dalle    schedule 14.10.2011


Ответы (6)


Ну, вы всегда можете связать sqlite3 статически и определить новые функции для доступа к файлам и т. д. через sqlite3_vfs.

person Vinzenz    schedule 14.10.2011

В VS2012 есть расширение, которое теперь называется SQLite для среды выполнения Windows. Вы можете загрузить и установить его через Visual Studio (требуется перезапуск IDE). Затем перейдите в свой проект WinRT, добавьте ссылку, в разделе «Windows» выберите «Расширения», и вы должны это увидеть.

введите здесь описание изображения

person b.pell    schedule 31.08.2012

Существует ветка winrt SQLite, в которой используются только поддерживаемые API. Кроме того, мы внедрили SQLite3-WinRT, компонент WinRT, который позволяет использовать SQLite в любом из языки WinRT.

person superquadratic    schedule 02.05.2012

  1. переименовать sqlite3.c в sqlite3.cpp
  2. заменить LoadLibrary на LoadPackagedLibrary
  3. Исправить множество синтаксических ошибок.
person linyehui    schedule 17.11.2011
comment
Зачем переименовывать? Вы можете связать модули c и c++ вместе. На самом деле, именно так я сам включаю SQLite... - person Jörgen Sigvardsson; 17.11.2011
comment
Мой VS11 на W8 Consumer Preview говорит, что вы не можете (не можете скомпилировать файлы C с параметром /ZW (Metro)). - person Cygon; 04.03.2012
comment
Вы можете создать проект статической библиотеки win32, а затем использовать .lib в проекте приложения в стиле метро. Пожалуйста, подождите следующего выпуска SQlite, потому что ветвь SQLite WinRT была объединена с транком. sqlite.org/src/timeline?r=winrt - person linyehui; 14.06.2012

С сайта SQLite

В SQLite версии 3.7.13 добавлена ​​поддержка WinRT и приложений в стиле Metro для Microsoft Windows 8. Версия 3.7.13 выходит раньше, чем обычно, после предыдущей версии, чтобы предоставить эту новую возможность разработчикам. Чтобы использовать SQLite в приложении в стиле метро, ​​скомпилируйте его с флагом -DSQLITE_OS_WINRT. Из-за повышенных требований безопасности WinRT к безопасности приложений все имена файлов базы данных должны быть полными путями. Обратите внимание, что SQLite не может обращаться к базам данных за пределами каталога установки и каталога данных приложения. Это ограничение — еще одна функция безопасности WinRT. Помимо этих ограничений, SQLite должен работать в WinRT точно так же, как и в любой другой системе.

Тим Хойер предоставляет пошаговый обзор о создании городского приложения с использованием SQLite в своем блоге

person Michael Brown    schedule 25.06.2012

Позвольте мне добавить несколько замечаний по использованию sqlite/winrt, которые могут избавить вас от головной боли:

  1. Winrt позволяет писать только в определенную папку (c:\users\‹пользователь›\Мои документы\‹приложение›). Вы должны поместить свою БД здесь. (Просто в управляемой среде.)

  2. Время от времени Sqlite использует временные файлы. (Сложные запросы, требующие временных индексов, очистки и т. д.) Эти файлы также должны быть созданы в папке приложения, но sqlite не будет этого делать, если вы не установите его с помощью прагмы temp_store_directory. Если вы этого не сделаете, вы можете получить случайные отчеты об ошибках пользователей.

  3. Обратите внимание, что приведенная выше прагма официально устарела. Не обращайте внимания. Нативные программисты могут захотеть использовать вместо этого глобальную переменную sqlite3_temp_directory (рекомендуемый способ), но текущий бинарный выпуск (dll) не публикует эту переменную. (Вы можете сделать это самостоятельно, но тогда измените исходники sqlite и используйте атрибут _declspec(dllexport); файл def не работает.)

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

Кроме этого проблем с winrt вроде нет. Более продвинутые пользователи могут предоставить свой собственный (лучший) драйвер winrt. Это не слишком сложно...

person Jan Slodicka    schedule 03.09.2012