SeregaZ, до вашего сообщения я как раз добавил проект (Project) в это решение (Solution) для компиляции в оригинальный GEMSPlay.exe на основе изменённого кода для DLL, для тестирования.
Добавил на GitHub:
https://github.com/infval/GEMSPlay.
После версии v2 + MASTERATN = 0, изменения в настройках проектов, по мелочи и одна ошибка оригинального кода при обработке seqcmd-seqgoto в GemsPlay.c:
case 111: // 111 = goto
//seqgoto:
{
INT16 JmpOfs;
UINT32 FinalAddr;
CurArg = GETSBYTE(ChnCCB, CHBUFPTR); // Исправил CurArg на JmpOfs
JmpOfs = (GETSBYTE(ChnCCB, CHBUFPTR) << 8) | (JmpOfs << 0);
Я оставил замену проигрывателю GEMSPlay - функция main - для тестирования функций библиотеки, если компилировать GEMSPlay (без библиотек), в котором используются gemsplay_init() и т.п. Для переключения замените #if 0 на #if 1 в GEMSPlayLibrary.c:
#if 0
int main(int argc, char* argv[])
какая студия используется? работает ли в ней сразу без ошибок оригинальный код проигрывателя? который не длл, а именно ехе оригинальный. себе поставлю такую-же.
<<< Ликбез по Visual Studio 2019 >>>УстановкаСтавить нужно Visual Studio 2019. В Visual Studio Installer выбрать язык Английский, из "Рабочих нагрузок" "Разработка классических приложений на C++", в "Отдельные компоненты" "Поддержка Windows XP на C++ для инструментов VS 2017".
Работа с проектамиОткрывать GEMSPlayLibrary.sln, в Solution Explorer будет 3 проекта: GEMSPlay (оригинальное консольное приложение), GEMSPlayClient (тест библиотеки), GEMSPlayLibrary (библиотека).
Для выбора активного проект (отмечен жирным шрифтом), ПКМ по нему -> Set as Startup Project. При компиляции и запуске (F5/Ctrl+F5) он и будет использован. Для DLL нет смысла, можно просто сделать сборку всего решешения (Build -> Build Solution) или ПКМ -> Build/Rebuild.
Из-за использования одинакового кода для библиотеки и GEMSPlay, входной main() у GEMSPlay в GEMSPlayLibrary.c, также стоит учесть, подсветка синтасиса для макросов препроцессора зависит от того, из какого проекта открыт файл .c/.h (я использовал GEMSPLAY_NO_LIBRARY в GEMSPlay, чтобы убрать предупреждения компилятора).
Настройка проектовУ каждого проекта есть Properties (ПКМ по проекту, хранятся в .vcxproj-файле), где для каждого из Configurantion (Debug/Release) и Platform (Win32/x64) настраиваются доп. библиотеки и другое:
* General > Platform Toolset: v142 - для Win7+, v141_xp - для поддержки XP. Выбрал только для Release/x86 для GEMSPlayClient/Library, так как поиск ошибок IntelliSense (на основе открытых файлов c/cpp/h) не работает из-за этого. Для возвращения на v142 нужно также выбрать Windows SDK Version - 10.0 (latest installed version).
* C/C++ > Code Generation > Runtime Library: влияет на добавление библиотек Visual C++ в exe. Если Debug на конце - для Debug конфигураций, а DLL значит, что не будет включено в exe. Сделал для Release/x86 для GEMSPlayClient/Library.
* Для GEMSPlayLibrary оставил pch.h (Precompiled Header), который был сгенерирован, и использовал C/C++ > Advanced > Forced Include File, чтобы неявно включить pch.h во все .c-файлы. Это можно убрать, по-хорошему туда включают часто используемые неизменяемые библиотеки как windows.h для ускорения компиляции.
* Debugging > Command Arguments: аргументы командной строки при запуске (F5/Ctrl+F5).
* В Solution Properties > Project Dependencies добавил зависимость GEMSPlayClient от GEMSPlayLibrary, чтобы можно было собрать решение, а не по отдельности.
в моем недоязыке в нужное место ставлю
Debug EnvOfs
и он мне показывает в окошке текстом значение. есть ли подобное в этом языке программирования?
Про отладкуУстановили аргументы командной строки и запускаете проект в конфигурации Debug с отладкой (F5, а не Ctrl+F5).
Чтобы выполнение остановилось, ставите breakpoint нажатием на область слева от номера строки кода. Можно делать шаги по строкам, как обычно.
Чтобы увидеть значение переменной, вводите её имя в панели Watch 1 внизу, во вкладках Auto и Locals отображаются соответствующие переменные на данный момент. Можно выводить в консоль через printf() или OutputDebugString() выводить в специальное окно, но там не строка форматирования (для решения этой проблемы смотрите ответы:
How do I print to the debug output window in a Win32 app?).