crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Чем заменить WinApi?
Litkevich Yuriy
  опции профиля:
сообщение 9.4.2010, 17:50
Сообщение #11


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(ido @ 9.4.2010, 20:33) *
У меня есть возможность посмотреть Qt только в Linux’е.
посмотри тут
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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  


Цитата(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
  опции профиля:
сообщение 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  


Цитата(ido @ 12.4.2010, 18:25) *
Просьба высказывать конструктивные предложения.
какие тебя предложения ещё интересуют? Ты с библиотекой определился?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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 или еще как-то.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 23:02