Чем заменить WinApi? |
Здравствуйте, гость ( Вход | Регистрация )
Чем заменить WinApi? |
Litkevich Yuriy |
9.4.2010, 17:50
Сообщение
#11
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
ido |
10.4.2010, 14:29
Сообщение
#12
|
Студент Группа: Участник Сообщений: 26 Регистрация: 7.4.2010 Пользователь №: 1602 Спасибо сказали: 0 раз(а) Репутация: 0 |
Нашел у себя в глубоких архивах исходники, примеры и документацию для Qt-3.3. Всё-таки слишком долго искать функции, вычитывая аналоги из англицкой документации.
Интересен такой момент из Wiki про wxWidget: Цитата основной код wxWidgets предпочитает вызывать «родной» элемент интерфейса платформы, вместо того, чтобы повторно его реализовывать. Каков механизм вызова? Ведь гораздо быстрее сравнивать исходники, если видны различия и указываются Api-функции или вызовы ядра системы. |
|
|
Iron Bug |
11.4.2010, 19:43
Сообщение
#13
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
по-моему, ты себе слабо представляешь, что такое wxWidgets, виджеты - это виджеты. у этой библиотеки нет задачи переписать все API какой-то одной системы. она предоставляет общий интерфейс для работы с графикой на кроссплатформенной основе и некоторые сопутствующие библиотеки (wxBase).
вообще говоря, не очень понятно, что и с чем ты собираешься "сравнивать". к тому же, портирование, которое ты собрался производить - это, скорее всего, не только замена одних вызовов на другие. у систем есть понятие архитектуры: потоков, синхронизации, событий и т.п. и это всё реализовано в разных системах по-разному. тут однозначного алгоритма для портирования нет и быть не может. кроссплатформенные библиотеки предоставляют обобщённые функции, которые поддерживаются всеми системами. и реализация, естественно, зависит от того, под какой системой планируется работа. она может быть простой, а может быть завязана на целый каскад действий, в зависимости от системы и требуемого эффекта. |
|
|
ido |
11.4.2010, 23:35
Сообщение
#14
|
Студент Группа: Участник Сообщений: 26 Регистрация: 7.4.2010 Пользователь №: 1602 Спасибо сказали: 0 раз(а) Репутация: 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 |
12.4.2010, 8:37
Сообщение
#15
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
дык, исходники-то всегда доступны. а код в исходниках не так уж и велик. по меркам современных сетей и вовсе мелок - несколько мегабайт для очень крупных библиотек. весь код обычно доступен и в хранилище, и в слепках. и QT, и wxWidgets, и boost имеют много реализаций под разные системы и весь код можно просматривать.
только копать там долго придётся, если что-то конкретное нужно. я думаю, в сети должны быть материалы по портированию и кто-нибудь, да собирал это всё в единую кучу. так что имеет смысл поискать такие ресурсы, прежде чем самому городить огород. |
|
|
Litkevich Yuriy |
12.4.2010, 8:50
Сообщение
#16
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
добавлю:
Простое подключение нескольких исходников в свой проект может привести к ошибкам сборки. Т.к. указанные библиотеки довольно сложны по внутреннему устройству и предполагают конфигурацию и последующую сборку как отдельных библиотек (динамически или статически линкуемых с приложением) |
|
|
ido |
12.4.2010, 14:25
Сообщение
#17
|
Студент Группа: Участник Сообщений: 26 Регистрация: 7.4.2010 Пользователь №: 1602 Спасибо сказали: 0 раз(а) Репутация: 0 |
Вся сложность задачи понятна. Почти всё, что есть в сети конкретно по моему вопросу известно. Другое дело, если это не может привести к обобщениям для разработки каких-то новых методик запуска других кроссплатформенных приложений(или сделать из обычной проги кроссплатформенную). Но и принципиальной невозможности для этого я пока не вижу, кроме того, что надо долго и упорно капаться в исходниках.
Цитата(Iron Bug) если что-то конкретное нужно. Для начала нужно заменить функции в исходниках так, чтобы собранная программа обращалась к системе(пока только Windows) через какую-то кроссплатформенную библиотеку. Бустовскую документацию я как открыл, так и закрыл. С ходу ничего не понял. Из Qt можно что-то брать, но для небольшого количества функций. В исходниках wx встречается большое количество аналогий c WinApi-функциями. Кстати, в предыдущем своем сообщении я не корректно обозвал CreateTempFileName() функцией WinApi. В мсдн есть GetTempFileName(). Это наводит на мысль, что аналогии формальные и, значит, где-то что-то не сойдется. Может, кто-нить подскажет через какую еще кроссплатформенную библиотеку можно достать WinApi-функции. Цитата(Litkevich Yuriy) Т.к. указанные библиотеки довольно сложны по внутреннему устройству и предполагают конфигурацию и последующую сборку как отдельных библиотек (динамически или статически линкуемых с приложением) В данном случае план такой. В исходниках программы вызовы WinApi-функций заменяются вызовом функций с аналогичным действием из кроссплатформенной библиотеки. Пишется интерфейсный модуль для этой библиотеки, которая, в свою очередь, является интерфейсом к ОС.Просьба высказывать конструктивные предложения. |
|
|
Litkevich Yuriy |
12.4.2010, 16:01
Сообщение
#18
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Iron Bug |
12.4.2010, 21:49
Сообщение
#19
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
видишь ли, кроссплатформенные библиотеки не были задуманы как замена API какой-то одной системы. они позиционируются как средство разработки кроссплатформенных приложений и больше рассчитаны на создание кроссплатформенных приложений с нуля, базируясь на средствах библиотеки. потому что работа в системе состоит не только из вызовов функций. это только малая часть.
ты уверен, что структура твоей программы настолько линейна, однопоточна и примитивна, что её можно перенести на другую платформу, заменив только API? и не проще ли создать новое кроссплатформенное приложение и в него интегрировать "рабочие" куски кода из старой программы? |
|
|
ido |
13.4.2010, 6:30
Сообщение
#20
|
Студент Группа: Участник Сообщений: 26 Регистрация: 7.4.2010 Пользователь №: 1602 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата(Iron Bug) ты уверен, что структура твоей программы настолько линейна, однопоточна и примитивна, что её можно перенести на другую платформу, заменив только API? Программа отнюдь не примитивна. Есть ядро системы, которое использует библиотеки Kernel.dll, Ole32.dll, User32.dll(только их надо заменить). Кроме того, создаются объектные файлы в специфическом формате и есть линкеры для Windows и Linux. Используется графическая среда, предоставляемая ОС. Например, при помощи библиотеки Japi можно использовать платформу Ява. В Linux’е можно будет потом определиться, использовать ли XWindow или еще как-то.
|
|
|
Текстовая версия | Сейчас: 9.11.2024, 15:26 |