![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
ido |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 7.4.2010 Пользователь №: 1602 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Есть программка, которая использует для своей загрузки около 30-и WinApi-функций из Kernel32.dll, User32.dll и Ole32.dll. При дальнейшей работе дополнительных функций она не использует. Нужно заменить в исходниках вызов этих функций на аналогичные из любой кроссплатформенной библиотеки, внося минимум изменений в код. Какую библиотеку проще всего использовать для этого и есть ли для нее что-то типа справочника по аналогам функций?
|
|
|
maint |
![]()
Сообщение
#2
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 235 Регистрация: 3.8.2009 Из: Иркутск Пользователь №: 982 Спасибо сказали: 28 раз(а) Репутация: ![]() ![]() ![]() |
Есть программка, которая использует для своей загрузки около 30-и WinApi-функций из Kernel32.dll, User32.dll и Ole32.dll. При дальнейшей работе дополнительных функций она не использует. Нужно заменить в исходниках вызов этих функций на аналогичные из любой кроссплатформенной библиотеки, внося минимум изменений в код. Какую библиотеку проще всего использовать для этого и есть ли для нее что-то типа справочника по аналогам функций? обычно конкретно спрашивают. А так, про телепатов в отпуске можно только ответ получить |
|
|
ViGOur |
![]()
Сообщение
#3
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
ido, какие функции хоть используются?
Как вариант в принципе можно их обернуть чем-то вроде
|
|
|
molchanoviv |
![]()
Сообщение
#4
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 597 Регистрация: 18.7.2008 Из: Саратов Пользователь №: 238 Спасибо сказали: 41 раз(а) Репутация: ![]() ![]() ![]() |
Если выбирать по похожести, то это WxWidgets. А так по-моему ничего лучше Qt нет.
|
|
|
ido |
![]()
Сообщение
#5
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 7.4.2010 Пользователь №: 1602 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата("ViGOur") какие функции хоть используются? Я тупо скопировал часть списка Цитата … Не думаю, что это проясняет что-либо. Хотелось бы выработать единообразную методику перехода с WinApi-функций на функции из кроссплатформенных библиотек, тогда, возможно, это будет интересно не только мне. Поэтому, надо искать аналоги в какойто документации.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 … Цитата("ViGOur") Как вариант в принципе можно их обернуть чем-то вроде… Насколько я знаю, это стандартный подход, но в данном случае обертки излишнее. Ведь под Windows уже есть готовая программа. Достаточно просто указать -- Библиотека.Функция (из Qt, WxWidgets…) |
|
|
molchanoviv |
![]()
Сообщение
#6
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 597 Регистрация: 18.7.2008 Из: Саратов Пользователь №: 238 Спасибо сказали: 41 раз(а) Репутация: ![]() ![]() ![]() |
Большинство из перечисленных функций можно заменить функциями из QFile. Ну или написать самому используя QFile.
|
|
|
Iron Bug |
![]()
Сообщение
#7
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
ну, как вариант - заменить на бустовские библиотеки. но придётся дорабатывать.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
ido |
![]()
Сообщение
#9
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 7.4.2010 Пользователь №: 1602 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата("molchanoviv") Большинство из перечисленных функций можно заменить функциями из QFile. У меня есть возможность посмотреть Qt только в Linux’е. Открыл QFile.h. Если правильно понимаю, то на месте вызовов ядра в Windows-версии должны быть WinApi-функции?
|
|
|
molchanoviv |
![]()
Сообщение
#10
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 597 Регистрация: 18.7.2008 Из: Саратов Пользователь №: 238 Спасибо сказали: 41 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#11
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
ido |
![]()
Сообщение
#12
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 7.4.2010 Пользователь №: 1602 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Нашел у себя в глубоких архивах исходники, примеры и документацию для Qt-3.3. Всё-таки слишком долго искать функции, вычитывая аналоги из англицкой документации.
Интересен такой момент из Wiki про wxWidget: Цитата основной код wxWidgets предпочитает вызывать «родной» элемент интерфейса платформы, вместо того, чтобы повторно его реализовывать. Каков механизм вызова? Ведь гораздо быстрее сравнивать исходники, если видны различия и указываются Api-функции или вызовы ядра системы. |
|
|
Iron Bug |
![]()
Сообщение
#13
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
по-моему, ты себе слабо представляешь, что такое wxWidgets, виджеты - это виджеты. у этой библиотеки нет задачи переписать все API какой-то одной системы. она предоставляет общий интерфейс для работы с графикой на кроссплатформенной основе и некоторые сопутствующие библиотеки (wxBase).
вообще говоря, не очень понятно, что и с чем ты собираешься "сравнивать". к тому же, портирование, которое ты собрался производить - это, скорее всего, не только замена одних вызовов на другие. у систем есть понятие архитектуры: потоков, синхронизации, событий и т.п. и это всё реализовано в разных системах по-разному. тут однозначного алгоритма для портирования нет и быть не может. кроссплатформенные библиотеки предоставляют обобщённые функции, которые поддерживаются всеми системами. и реализация, естественно, зависит от того, под какой системой планируется работа. она может быть простой, а может быть завязана на целый каскад действий, в зависимости от системы и требуемого эффекта. |
|
|
ido |
![]()
Сообщение
#14
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 7.4.2010 Пользователь №: 1602 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
по-моему, ты себе слабо представляешь, что такое wxWidgets... Пока только начал искать и вопрос такой: качать иль не качать. Если качать, тогда что именно(не всё же подряд). Вот нашел по отдельным файламЦитата ============================================================================ Здесь явно видно WinApi-функцию -- CreateTempFileName(). Так искать удобнее, чем по документации Qt. Может есть более простой вариант. С программой, где надо заменять, всё достаточно просто, если не придется использовать case, разделяя код для Windows и Linux. 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: } |
|
|
Iron Bug |
![]()
Сообщение
#15
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
дык, исходники-то всегда доступны. а код в исходниках не так уж и велик. по меркам современных сетей и вовсе мелок - несколько мегабайт для очень крупных библиотек. весь код обычно доступен и в хранилище, и в слепках. и QT, и wxWidgets, и boost имеют много реализаций под разные системы и весь код можно просматривать.
только копать там долго придётся, если что-то конкретное нужно. я думаю, в сети должны быть материалы по портированию и кто-нибудь, да собирал это всё в единую кучу. так что имеет смысл поискать такие ресурсы, прежде чем самому городить огород. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#16
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
добавлю:
Простое подключение нескольких исходников в свой проект может привести к ошибкам сборки. Т.к. указанные библиотеки довольно сложны по внутреннему устройству и предполагают конфигурацию и последующую сборку как отдельных библиотек (динамически или статически линкуемых с приложением) |
|
|
ido |
![]()
Сообщение
#17
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 7.4.2010 Пользователь №: 1602 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Вся сложность задачи понятна. Почти всё, что есть в сети конкретно по моему вопросу известно. Другое дело, если это не может привести к обобщениям для разработки каких-то новых методик запуска других кроссплатформенных приложений(или сделать из обычной проги кроссплатформенную). Но и принципиальной невозможности для этого я пока не вижу, кроме того, что надо долго и упорно капаться в исходниках.
Цитата(Iron Bug) если что-то конкретное нужно. Для начала нужно заменить функции в исходниках так, чтобы собранная программа обращалась к системе(пока только Windows) через какую-то кроссплатформенную библиотеку. Бустовскую документацию я как открыл, так и закрыл. С ходу ничего не понял. Из Qt можно что-то брать, но для небольшого количества функций. В исходниках wx встречается большое количество аналогий c WinApi-функциями. Кстати, в предыдущем своем сообщении я не корректно обозвал CreateTempFileName() функцией WinApi. В мсдн есть GetTempFileName(). Это наводит на мысль, что аналогии формальные и, значит, где-то что-то не сойдется. Может, кто-нить подскажет через какую еще кроссплатформенную библиотеку можно достать WinApi-функции. Цитата(Litkevich Yuriy) Т.к. указанные библиотеки довольно сложны по внутреннему устройству и предполагают конфигурацию и последующую сборку как отдельных библиотек (динамически или статически линкуемых с приложением) В данном случае план такой. В исходниках программы вызовы WinApi-функций заменяются вызовом функций с аналогичным действием из кроссплатформенной библиотеки. Пишется интерфейсный модуль для этой библиотеки, которая, в свою очередь, является интерфейсом к ОС.Просьба высказывать конструктивные предложения. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#18
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Iron Bug |
![]()
Сообщение
#19
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
видишь ли, кроссплатформенные библиотеки не были задуманы как замена API какой-то одной системы. они позиционируются как средство разработки кроссплатформенных приложений и больше рассчитаны на создание кроссплатформенных приложений с нуля, базируясь на средствах библиотеки. потому что работа в системе состоит не только из вызовов функций. это только малая часть.
ты уверен, что структура твоей программы настолько линейна, однопоточна и примитивна, что её можно перенести на другую платформу, заменив только API? и не проще ли создать новое кроссплатформенное приложение и в него интегрировать "рабочие" куски кода из старой программы? |
|
|
ido |
![]()
Сообщение
#20
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 7.4.2010 Пользователь №: 1602 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Iron Bug) ты уверен, что структура твоей программы настолько линейна, однопоточна и примитивна, что её можно перенести на другую платформу, заменив только API? Программа отнюдь не примитивна. Есть ядро системы, которое использует библиотеки Kernel.dll, Ole32.dll, User32.dll(только их надо заменить). Кроме того, создаются объектные файлы в специфическом формате и есть линкеры для Windows и Linux. Используется графическая среда, предоставляемая ОС. Например, при помощи библиотеки Japi можно использовать платформу Ява. В Linux’е можно будет потом определиться, использовать ли XWindow или еще как-то.
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 14.4.2025, 21:11 |