2013-05-01 7 views
0

Я конвертирую приложение C++ Win32 в Linux, у меня есть проблемы с типами и функциями, которые используются в приложении Win32, я решил проблему типов (используя typedef и micros), но я не знаю, t знать, какую функцию я должен использовать вместо этих функций?Porting C++ Win32 app to linux app

- CreateFile

- ReadFile

- GetFileSize

-GlobalAlloc

-wsprintf

-GlobalFree

+1

Является ли ваше приложение графическим приложением? Считаете ли вы использование некоторой библиотеки переносимости? Например, Qt и Gtk работают на обеих системах ... (и оба Qt и Gtk обеспечивают уровень низкого уровня, который можно использовать без какого-либо графического интерфейса) –

+0

ry, используя стандартные функции C, а не вызовы Win API – Mark

+0

На самом деле мое приложение читает растровое изображение и отправляет его на принтер после некоторых модификаций, и я использую Anjuta в openSUSE 12.3, и мне не хватает времени для переноса кодов на Qt или ... – Areff

ответ

2

В большинстве случаев CreateFile, ReadFile может быть заменен стандартным C или Управление файлами на C++ (то есть или fstream операции типа). Однако есть некоторые опции, которые вы не можете получить до этого (например, «эксклюзивный доступ» к файлу), поэтому дьявол, как обычно, подробно описан.

Edit: fopen будет создавать и fread прочтет из FILE *, fstream::open и fstream::read бы функции для создания и чтения из fstream.

GetFileSize обычно делается путем «поискать конец файла, а затем получить позицию файла». Итак, для FILE * используйте fseek(fp, 0, SEEK_END); и size = ftell();, или fstream::seekg(); и fstream::tellg() - не забудьте сделать поиск в начале, прежде чем читать из файла.

GlobalAlloc и GlobalFree должна быть тонкой, чтобы заменить соответствующий из malloc или new и free или delete в зависимости от того, как именно она используется.

Стандартная функция для печати в строку wchar_t - это swprintf, которая также должна работать на Windows, если компилятор соответствует стандартам.

Преимущество использования стандартной библиотеки C (++) заключается в том, что теперь вы можете скомпилировать код для окон и linux, не меняя код. И маловероятно, что вы сможете отличить производительность.

+0

Вы не можете получить «эксклюзивный доступ» в Unix, период, если вы не используете блокировку файлов (дополнительные запросы). Однако наиболее частая причина использования 'CreateFile', которую я видел, была связана с целостностью транзакций. –

+0

И, как я часто указывал, стремясь до конца, то, выполняя 'ftell()', не гарантирует вам ничего полезного. (Но это, вероятно, будет работать под Windows и Unix.) –

2
  • CreateFile: open
  • ReadFile: read
  • GetFileSize: stat (Это дает вам много других информации, а также. Для размера, поле st_size)
  • GlobalAlloc и GlobalFree:. Вы можете просто использовать malloc и free.
  • wsprintf: Это похоже на то же самое, что и стандартный C функции swprintf, которые должны присутствовать в любой системе, которая поддерживает C.
+1

Использование 'open' и' read' приведет к тому, что исходный код будет отличаться для Linux, чем Windows, используя 'fopen' и' fread', чтобы код был скомпилирован одинаково для обеих архитектур. –

+0

Это зависит от того, почему были использованы «CreateFile» и «ReadFile». По крайней мере, 'fopen' и' fread' должны использовать двоичный режим. Но обычной причиной использования 'CreateFile' для начала является то, что вам нужны режимы, которые' fopen' не поддерживает. –

+0

Я видел множество применений 'CreateFile' и' ReadFile' в неверно настроенном убеждении, что он «быстрее», чем 'fopen' и' fread'. Но, как я уже сказал в своем ответе, это зависит от того, какие аргументы передаются 'CreateFile'. –