Использование API win32 в коде vs

Я начал процесс воплощения своих программных идей в жизнь. Моя проблема в том, что я не могу заставить API работать и работать.

Я использую код Visual Studio и компилятор mingw x64.

я просто запускаю пример кода от Microsoft о том, как создать программу Direct2D,

Справка

и базовый класс окна из управления состоянием приложения,

ссылка 2

единственная разница в том, что я поленился и скопировал и вставил класс basewidow вместо того, чтобы включить его, как они сделали с basewin.h

Эта проблема:

когда я запускаю пример кода, я получаю эту ошибку,

C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\uub17\AppData\Local\Temp\ccti919g.o:myprogram.cpp:(.text$_Z17D2D1CreateFactory17D2D1_FACTORY_TYPERK5_GUIDPPv[_Z17D2D1CreateFactory17D2D1_FACTORY_TYPERK5_GUIDPPv]+0x2b): undefined reference to `D2D1CreateFactory'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o): in function `main':
C:/M/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain'
collect2.exe: error: ld returned 1 exit status

я немного поискал и обнаружил, что API делится на Ansi и Unicode, поэтому я попробовал Unicode-версию точки входа API «winMain» вместо «wwinMain» и изменил «pwstr» на «pstr», когда я запускаю затем я получаю этот вывод в терминале,

In instantiation of 'BOOL BaseWindow<DERIVED_TYPE>::Create(PCWSTR, DWORD, DWORD, int, int, int, int, HWND, HMENU) [with DERIVED_TYPE = MainWindow; BOOL = int; PCWSTR = const wchar_t*; DWORD = long unsigned int; HWND = HWND__*; HMENU = HMENU__*]':
myprogram.cpp:202:20:   required from here
myprogram.cpp:54:37: error: cannot convert 'PCWSTR' {aka 'const wchar_t*'} to 'LPCSTR' {aka 'const char*'} in assignment
   54 |         wc.lpszClassName = ClassName();
      |                            ~~~~~~~~~^~
      |                                     |
      |                                     PCWSTR {aka const wchar_t*}
myprogram.cpp:59:33: error: cannot convert 'PCWSTR' {aka 'const wchar_t*'} to 'LPCSTR' {aka 'const char*'}
   59 |             dwExStyle, ClassName(), lpWindowName, dwStyle, x, y,
      |                        ~~~~~~~~~^~
      |                                 |
      |                                 PCWSTR {aka const wchar_t*}
In file included from C:/msys64/mingw64/include/windows.h:72,
                 from myprogram.cpp:1:
C:/msys64/mingw64/include/winuser.h:2203:65: note:   initializing argument 2 of 'HWND__* CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID)'
 2203 |   WINUSERAPI HWND WINAPI CreateWindowExA(DWORD dwExStyle,LPCSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam);

Я провел дополнительные поиски и где-то увидел, что мой компилятор mingw crt не поддерживает юникод, широкие символы или что-то в этом роде и должен использовать WinMain, поэтому я оставил WinMain в качестве точки входа и определил UNICODE и _UNICODE, которые уже определены в папке свойств cpp json, и я получаю это в терминале

C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\uub17\AppData\Local\Temp\ccT85reo.o:myprogram.cpp:(.text$_Z17D2D1CreateFactory17D2D1_FACTORY_TYPERK5_GUIDPPv[_Z17D2D1CreateFactory17D2D1_FACTORY_TYPERK5_GUIDPPv]+0x2b): undefined reference to `D2D1CreateFactory'
collect2.exe: error: ld returned 1 exit status

Я мало что знаю, но я зашел так далеко, что изменил все, что связано со строками, на версии ansi и unicode, чтобы устранить необходимость преобразования, но в целом я получаю тот же результат.

Я не понимаю, как код с сайта Microsoft может дать сбой и как компилятор, созданный для win32, не поддерживает то, что поддерживает ОС.

я буквально не могу запустить пример кода, лол, пожалуйста, просветите меня

как правило, все, что я пробовал, менялось на версии функций, которые являются ansi, в любом случае пытаясь использовать Unicode, хотя, по-видимому, он несовместим с моим компилятором из-за использования различных макросов и определений, предоставленных Microsoft, и проверки настроек vscode json и сборки, которые

c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "C:\\msys64\\mingw64\\bin\\gcc.exe",
            "cStandard": "gnu17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "windows-gcc-x64"
        }
    ],
    "version": 4
}
tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe build active file",
            "command": "C:\\msys64\\mingw64\\bin\\g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "compiler: C:\\msys64\\mingw64\\bin\\g++.exe"
        }
    ]
}

запуск.json

 "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\msys64\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description":  "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],

            "preLaunchTask": "C/C++: g++.exe build active file"
        }



    ]
}

Может быть, попробовать базовую программу MessageBox hello world, прежде чем переходить к Direct2d...

Anders 22.03.2022 00:43

Почему бы вам не попробовать Visual Studio Community Edition вместо VSCore+MinGW? Это бесплатно, и вы не будете иметь дело с проблемами MinGW - я просто больше не использую его, но для очень простых вещей это слишком раздражает: последняя версия, которая у меня была (поставляется с Qt 6.2.3), не позволяет даже компилировать исполняемые файлы отладки прямо из коробки! Вам также может не хватать надлежащего WinSDK и/или DirectX SDK...

Wisblade 22.03.2022 02:42
«компилятор, созданный для win32, не поддерживает то, что поддерживает ОС» — GCC не предназначен для программирования под Windows. MinGW — это попытка дооснащения поддержки Windows, но поддержка неоднородна, с вручную настроенными заголовочными файлами SDK и пользовательскими библиотеками импорта. Обычно тоже древний. Особенно при использовании COM из внутренних компонентов компилятора C++, которые внезапно становятся частью общедоступного интерфейса. Я бы не стал использовать здесь GCC. Лучше всего это сделать с помощью MSVC или Clang. Опять же, я бы все равно не использовал VS Code. К тому времени, когда вы захотите отладить свою программу, вы захотите вместо этого использовать Visual Studio.
IInspectable 22.03.2022 07:40

@IInspectable спасибо, что информация очень помогла, и yeeeeeaaahh, «С другой стороны, я бы все равно не использовал VS Code. К тому времени, когда вы захотите отладить свою программу, вы бы предпочли, чтобы вместо этого вы использовали Visual Studio», я замечаю, что довольно быстро. Есть ли какие-либо другие компиляторы, о которых я должен знать или держаться подальше, лол, я действительно не хочу проходить через это снова

kk17 22.03.2022 16:58

@Wisblade только что скачал его

kk17 22.03.2022 17:01

@IInspectable VSCode может быть хорошим инструментом, но когда вы используете его для того, для чего он лучше всего (ИМХО): управление nix/embedded удаленная машина из-под Windows с неплохим интерфейсом и разными взаимосвязанными инструментами... Или как текстовый редактор общего назначения. Для меня в режиме IDE это хорошая альтернатива Eclipse (или голому SSH-терминалу...), потому что Eclipsecking ОГРОМНЫМ и медленным, как мучительная смерть. Но никак не сравнится с Visual Studio для разработки под Windows... Даже QtCreator намного ниже VS, а QtC уже продвинутее VSCode.

Wisblade 23.03.2022 02:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

D2D1CreateFactory не может быть найден, потому что вы не связываете D2d1.lib, как указано в https://docs.microsoft.com/en-us/windows/win32/api/d2d1/nf-d2d1-d2d1createfactory. Добавьте аргумент -ld2d1 в командную строку. Возможно, вам нужно также использовать директиву -L для указания каталога.

Для компилятора MSVC можно использовать директиву pragma (которая, вероятно, не работает для mingw).

#pragma comment(lib, "d2d1")

ОТРЕДАКТИРОВАНО

Добавлено "-ld2d1", непосредственно перед "-o",.

        "args": [
            "-fdiagnostics-color=always",
            "-g",
            "${file}",
            "-ld2d1",
            "-o",
            "${fileDirname}\\${fileBasenameNoExtension}.exe"
        ],

Сек, спасибо, чувак, да, у меня был комментарий прагмы, но я использую mingw. Я добавил аргументы в командную строку и получил следующие результаты. У меня мало знаний об использовании терминала, я просмотрел аргументы командной строки для кода vs, но не смог найти те, которые вы мне показали здесь.

kk17 22.03.2022 16:45

- 1d21 + - 1d21 + ~ Отсутствует выражение после унарного оператора '-'. В строке: 1 символ: 3 + - 1d21 + ~~~~ Неожиданный токен '1d21' в выражении или операторе. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingExpressionAfterOperator

kk17 22.03.2022 16:47

- L + - L + ~ Отсутствует выражение после унарного оператора '-'. В строке: 1 символ: 3 + - L + ~ Неожиданный токен 'L' в выражении или операторе. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingExpressionAfterOperator + - L 1d2d1 + ~ Отсутствует выражение после унарного оператора '-'. В строке:1 символ:3 + - L 1d2d1 + ~ Неожиданный токен 'L' в выражении или операторе. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingExpressionAfterOperator

kk17 22.03.2022 16:48

Не пытайтесь напечатать это из моего ответа, просто скопируйте, потому что это -ld2d1. Например, поставьте "-ld2d1", перед "-o", (я предполагаю, что у вас есть библиотека d2d1).

Daniel Sęk 22.03.2022 17:48

Сек, ты лучший, это сработало

kk17 23.03.2022 15:20

Другие вопросы по теме