Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чем заменить WinApi?
Форум на CrossPlatform.RU > Библиотеки > Другие библиотеки
ido
Есть программка, которая использует для своей загрузки около 30-и WinApi-функций из Kernel32.dll, User32.dll и Ole32.dll. При дальнейшей работе дополнительных функций она не использует. Нужно заменить в исходниках вызов этих функций на аналогичные из любой кроссплатформенной библиотеки, внося минимум изменений в код. Какую библиотеку проще всего использовать для этого и есть ли для нее что-то типа справочника по аналогам функций?
maint
Цитата(ido @ 9.4.2010, 11:55) *
Есть программка, которая использует для своей загрузки около 30-и WinApi-функций из Kernel32.dll, User32.dll и Ole32.dll. При дальнейшей работе дополнительных функций она не использует. Нужно заменить в исходниках вызов этих функций на аналогичные из любой кроссплатформенной библиотеки, внося минимум изменений в код. Какую библиотеку проще всего использовать для этого и есть ли для нее что-то типа справочника по аналогам функций?

обычно конкретно спрашивают. А так, про телепатов в отпуске можно только ответ получить
ViGOur
ido, какие функции хоть используются?

Как вариант в принципе можно их обернуть чем-то вроде
#ifdef _LINUX_ 
   // Линуксовое API
#endif

#ifdef _WINDOWS_
   // Виндовое API
#endif
molchanoviv
Если выбирать по похожести, то это WxWidgets. А так по-моему ничего лучше Qt нет.
ido
Цитата("ViGOur")
какие функции хоть используются?

Я тупо скопировал часть списка
Цитата

Name: WriteFile
Name: SetFilePointer
Name: SetFileAttributesA
Name: ReadFile
Name: MoveFileA
Name: GetVolumeInformationA
Name: GetTempPathA
Name: GetModuleFileNameA
Name: GetLastError
Name: GetFileTime
Name: GetFileSize
Name: GetFileAttributesA
Name: GetDriveTypeA
Name: GetCommandLineA
Name: FindNextFileA
Name: FindFirstFileA
Name: FindClose
Name: FileTimeToSystemTime
Name: DeleteFileA
Name: CreateFileA
Name: CreateDirectoryA
Name: CloseHandle
Name: VirtualProtect
Name: VirtualFree
Name: VirtualAlloc
Name: SuspendThread
Name: Sleep
Не думаю, что это проясняет что-либо. Хотелось бы выработать единообразную методику перехода с WinApi-функций на функции из кроссплатформенных библиотек, тогда, возможно, это будет интересно не только мне. Поэтому, надо искать аналоги в какойто документации.
Цитата("ViGOur")
Как вариант в принципе можно их обернуть чем-то вроде…
Насколько я знаю, это стандартный подход, но в данном случае обертки излишнее. Ведь под Windows уже есть готовая программа. Достаточно просто указать -- Библиотека.Функция (из Qt, WxWidgets…)
molchanoviv
Большинство из перечисленных функций можно заменить функциями из QFile. Ну или написать самому используя QFile.
Iron Bug
ну, как вариант - заменить на бустовские библиотеки. но придётся дорабатывать.
Litkevich Yuriy
Цитата(molchanoviv @ 9.4.2010, 17:23) *
Если выбирать по похожести, то это WxWidgets.
Я думаю, что WxWidgets, как и MFC достаточно высокоуровневая обёртка над WinAPI, поэтому код всё равно прийдётся основательно переписывать.
ido
Цитата("molchanoviv")
Большинство из перечисленных функций можно заменить функциями из QFile.
У меня есть возможность посмотреть Qt только в Linux’е. Открыл QFile.h. Если правильно понимаю, то на месте вызовов ядра в Windows-версии должны быть WinApi-функции?
molchanoviv
Цитата(ido @ 9.4.2010, 17:33) *
У меня есть возможность посмотреть Qt только в Linux’е. Открыл QFile.h. Если правильно понимаю, то на месте вызовов ядра в Windows-версии должны быть WinApi-функции?


не понял.
Litkevich Yuriy
Цитата(ido @ 9.4.2010, 20:33) *
У меня есть возможность посмотреть Qt только в Linux’е.
посмотри тут
ido
Нашел у себя в глубоких архивах исходники, примеры и документацию для Qt-3.3. Всё-таки слишком долго искать функции, вычитывая аналоги из англицкой документации.

Интересен такой момент из Wiki про wxWidget:
Цитата
основной код wxWidgets предпочитает вызывать «родной» элемент интерфейса платформы, вместо того, чтобы повторно его реализовывать.
Каков механизм вызова? Ведь гораздо быстрее сравнивать исходники, если видны различия и указываются Api-функции или вызовы ядра системы.
Iron Bug
по-моему, ты себе слабо представляешь, что такое wxWidgets, виджеты - это виджеты. у этой библиотеки нет задачи переписать все API какой-то одной системы. она предоставляет общий интерфейс для работы с графикой на кроссплатформенной основе и некоторые сопутствующие библиотеки (wxBase).
вообще говоря, не очень понятно, что и с чем ты собираешься "сравнивать".
к тому же, портирование, которое ты собрался производить - это, скорее всего, не только замена одних вызовов на другие. у систем есть понятие архитектуры: потоков, синхронизации, событий и т.п. и это всё реализовано в разных системах по-разному. тут однозначного алгоритма для портирования нет и быть не может. кроссплатформенные библиотеки предоставляют обобщённые функции, которые поддерживаются всеми системами. и реализация, естественно, зависит от того, под какой системой планируется работа. она может быть простой, а может быть завязана на целый каскад действий, в зависимости от системы и требуемого эффекта.
ido
Цитата(Iron Bug @ 11.4.2010, 19:43) *
по-моему, ты себе слабо представляешь, что такое wxWidgets...
Пока только начал искать и вопрос такой: качать иль не качать. Если качать, тогда что именно(не всё же подряд). Вот нашел по отдельным файлам
Цитата
============================================================================
458: // implementation of wxTempFile
459: // ============================================================================
460:
461: // ----------------------------------------------------------------------------
462: // construction
463: // ----------------------------------------------------------------------------
464:
465: wxTempFile::wxTempFile(const wxString& strName)
466: {
467: Open(strName);
468: }
469:
470: bool wxTempFile::Open(const wxString& strName)
471: {
472: // we must have an absolute filename because otherwise CreateTempFileName()
473: // would create the temp file in $TMP (i.e. the system standard location
474: // for the temp files) which might be on another volume/drive/mount and
475: // wxRename()ing it later to m_strName from Commit() would then fail
476: //
477: // with the absolute filename, the temp file is created in the same
478: // directory as this one which ensures that wxRename() may work later
479: wxFileName fn(strName);
480: if ( !fn.IsAbsolute() )
481: {
482: fn.Normalize(wxPATH_NORM_ABSOLUTE);
483: }
484:
485: m_strName = fn.GetFullPath();
486:
487: m_strTemp = wxFileName::CreateTempFileName(m_strName, &m_file);
488:
489: if ( m_strTemp.empty() )
490: {
491: // CreateTempFileName() failed
492: return false;
493: }
494:
495: #ifdef __UNIX__
496: // the temp file should have the same permissions as the original one
497: mode_t mode;
498:
499: wxStructStat st;
500: if ( stat( (const char*) m_strName.fn_str(), &st) == 0 )
501: {
502: mode = st.st_mode;
503: }
504: else
505: {
506: // file probably didn't exist, just give it the default mode _using_
507: // user's umask (new files creation should respect umask)
508: mode_t mask = umask(0777);
509: mode = 0666 & ~mask;
510: umask(mask);
511: }
512:
513: if ( chmod( (const char*) m_strTemp.fn_str(), mode) == -1 )
514: {
515: #ifndef __OS2__
516: wxLogSysError(_("Failed to set temporary file permissions"));
517: #endif
518: }
519: #endif // Unix
520:
521: return true;
522: }
Здесь явно видно WinApi-функцию -- CreateTempFileName(). Так искать удобнее, чем по документации Qt. Может есть более простой вариант. С программой, где надо заменять, всё достаточно просто, если не придется использовать case, разделяя код для Windows и Linux.

Iron Bug
дык, исходники-то всегда доступны. а код в исходниках не так уж и велик. по меркам современных сетей и вовсе мелок - несколько мегабайт для очень крупных библиотек. весь код обычно доступен и в хранилище, и в слепках. и QT, и wxWidgets, и boost имеют много реализаций под разные системы и весь код можно просматривать.
только копать там долго придётся, если что-то конкретное нужно. я думаю, в сети должны быть материалы по портированию и кто-нибудь, да собирал это всё в единую кучу. так что имеет смысл поискать такие ресурсы, прежде чем самому городить огород.
Litkevich Yuriy
добавлю:
Простое подключение нескольких исходников в свой проект может привести к ошибкам сборки. Т.к. указанные библиотеки довольно сложны по внутреннему устройству и предполагают конфигурацию и последующую сборку как отдельных библиотек (динамически или статически линкуемых с приложением)
ido
Вся сложность задачи понятна. Почти всё, что есть в сети конкретно по моему вопросу известно. Другое дело, если это не может привести к обобщениям для разработки каких-то новых методик запуска других кроссплатформенных приложений(или сделать из обычной проги кроссплатформенную). Но и принципиальной невозможности для этого я пока не вижу, кроме того, что надо долго и упорно капаться в исходниках.
Цитата(Iron Bug)
если что-то конкретное нужно.
Для начала нужно заменить функции в исходниках так, чтобы собранная программа обращалась к системе(пока только Windows) через какую-то кроссплатформенную библиотеку. Бустовскую документацию я как открыл, так и закрыл. С ходу ничего не понял. Из Qt можно что-то брать, но для небольшого количества функций. В исходниках wx встречается большое количество аналогий c WinApi-функциями. Кстати, в предыдущем своем сообщении я не корректно обозвал CreateTempFileName() функцией WinApi. В мсдн есть GetTempFileName(). Это наводит на мысль, что аналогии формальные и, значит, где-то что-то не сойдется. Может, кто-нить подскажет через какую еще кроссплатформенную библиотеку можно достать WinApi-функции.
Цитата(Litkevich Yuriy)
Т.к. указанные библиотеки довольно сложны по внутреннему устройству и предполагают конфигурацию и последующую сборку как отдельных библиотек (динамически или статически линкуемых с приложением)
В данном случае план такой. В исходниках программы вызовы WinApi-функций заменяются вызовом функций с аналогичным действием из кроссплатформенной библиотеки. Пишется интерфейсный модуль для этой библиотеки, которая, в свою очередь, является интерфейсом к ОС.

Просьба высказывать конструктивные предложения.
Litkevich Yuriy
Цитата(ido @ 12.4.2010, 18:25) *
Просьба высказывать конструктивные предложения.
какие тебя предложения ещё интересуют? Ты с библиотекой определился?
Iron Bug
видишь ли, кроссплатформенные библиотеки не были задуманы как замена API какой-то одной системы. они позиционируются как средство разработки кроссплатформенных приложений и больше рассчитаны на создание кроссплатформенных приложений с нуля, базируясь на средствах библиотеки. потому что работа в системе состоит не только из вызовов функций. это только малая часть.
ты уверен, что структура твоей программы настолько линейна, однопоточна и примитивна, что её можно перенести на другую платформу, заменив только API? и не проще ли создать новое кроссплатформенное приложение и в него интегрировать "рабочие" куски кода из старой программы?
ido
Цитата(Iron Bug)
ты уверен, что структура твоей программы настолько линейна, однопоточна и примитивна, что её можно перенести на другую платформу, заменив только API?
Программа отнюдь не примитивна. Есть ядро системы, которое использует библиотеки Kernel.dll, Ole32.dll, User32.dll(только их надо заменить). Кроме того, создаются объектные файлы в специфическом формате и есть линкеры для Windows и Linux. Используется графическая среда, предоставляемая ОС. Например, при помощи библиотеки Japi можно использовать платформу Ява. В Linux’е можно будет потом определиться, использовать ли XWindow или еще как-то.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.