Реализует ли WINE «_printf» и подобные функции в MSVCRT?

Мы должны быть более осторожными при этом. Впервые я изменил размер шрифта меню по ошибке вместо шрифта. Сначала создайте свою собственную схему, выбрав File -> Settings -> Colors & amp; Шрифты, а затем вы можете внести изменения в свою схему. Окончательная процедура - перейти к настройкам (Файл -> Настройки), а затем выбрать Редактор и Цвета и amp; Fontsin в меню левой панели. Затем выберите стрелку слева от Colors & amp; Шрифты, а затем выберите Шрифт в левой панели меню. Вы получите варианты для изменения ваших значений. Помните, что вы можете изменять значения только в своей собственной симе.

-8
задан Cody Gray 24 June 2019 в 20:44
поделиться

2 ответа

Однако, если я пытаюсь запустить ту программу на ВИНЕ на Oracle Linux, вывод, я добираюсь:

000f:fixme:service:scmdatabase_autostart_services Auto-start service L"MountMgr" failed to start: 2
000f:fixme:service:scmdatabase_autostart_services Auto-start service L"WineBus" failed to start: 2
wine: Bad EXE format for Z:\home\teo.samarzija\Documents\Assembly\debug.exe.

А "Плохая ошибка" формата EXE является чем-то другим полностью. Это не подразумевает, что проблемой является отсутствие импортированная функция. Загрузчик никогда не получал это далеко. Это даже не смогло считать Ваш двоичный файл. Это очень вероятно вызывается несоответствием разрядности. Например, пытаясь запустить 64-разрядное приложение в 32-разрядной системе.

Кроме этой проблемы, стоит указать, что Ваше предпринятое использование функций библиотеки времени выполнения C является по сути непортативным. Это могло бы работа, если Вино (или безотносительно другой среды выполнения) предоставляет функции идентичную подпись, но это очень вероятно не будет.

я предполагаю, что должен далее разъясниться, начиная с вызова стандарт , "непортативная" функция библиотеки времени выполнения C может повысить несколько бровей. Эти функции являются портативными в уровень исходного кода , но не в двоичный файл уровень. Даже без добавленной сложности Вина, функции библиотеки времени выполнения C являются непортативными, как CRT Microsoft , присвоил версию — необходимо связаться с соответствующей версией и иметь тот DLL в наличии во времени выполнения, или приложение не будет работать.

Эта точная проблема состоит в том, почему Windows обеспечивает обертки для этих стандартных функций как часть базовой платформы API, который универсально доступен. Если Вы хотите быть полностью портативными ко всем реализациям среды Win32, и Вы не связываетесь в своей собственной копии библиотеки времени выполнения C, то необходимо вызвать эти функции вместо этого.

версия Win32 эти sprintf функция wsprintf . Это имеет тот же интерфейс как sprintf, таким образом, можно назвать это тем же путем как общедоступная замена. На самом деле, хотя Вы не должны полагаться на это, это реализовано Windows как простая обертка вокруг sprintf версия, обеспеченная локальной копией библиотек времени выполнения C.

, Если Вы хотите версию, которой можно передать список аргументов (а-ля vsprintf), затем можно звонить wvsprintf .

Примечание, что, в отличие от большей части Windows API functions, эти функции используют __cdecl соглашение о вызовах, не __stdcall соглашение о вызовах. Удостоверьтесь, что Вы придерживаетесь этого в своем ассемблерном коде. Короче говоря, это означает передающие аргументы справа налево и чистку стека на сайте вызова.

Microsoft, однако, удержала от использования эти функции, поскольку они не совершенно безопасны (переполнение буфера, и и т.д. возможны). Как замены, они предлагают функции в StrSafe.h заголовок. Эти функции прибывают в два варианта: те, которые берут количество байтов (Cb) и те, которые берут количество символов (Cch). Соответствующие к этому обсуждению были бы или StringCbPrintfA или StringCchPrintfA . Они более хитры для использования от ассемблера, однако, потому что они предназначены, чтобы использоваться встроенные просто включая StrSafe.h заголовочный файл. Можно использовать их в форме библиотеки, но затем необходимо будет передать соответствие StrSafe.lib тупики компоновщику. Обратите внимание, что соединение с этой библиотекой означает, что Ваше приложение будет только работать на Windows XP с SP2 или позже.

Это получает Вас на полпути там. Вы на самом деле пытаетесь звонить printf, а не sprintf. Разрыв, конечно, писал отформатированную строку в консоль. После того как у Вас есть отформатированная строка (сгенерированный [1 118], StringCchPrintfA, или безотносительно), который может быть выполнен путем вызова WriteConsole функция, которая является API Win32 для записи вывода к консоли. Если Вы хотите STDOUT, то необходимо открыть тот дескриптор сначала с [1 121].

1
ответ дан 5 September 2019 в 20:35
поделиться

Так или иначе я получил ответ:

https://www.linuxquestions.org/questions/linux-general-1/can%27t-install-wine-on-64-bit-oracle-linux-4175655895/page2.html#post 6012838

Короче говоря, на 64-разрядной Oracle Linux, ВИНО должно быть скомпилировано из источника для работы правильно.

0
ответ дан 5 September 2019 в 20:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: