Консоль Visual Studio C ++ джойстик

Я пытаюсь скомпилировать код из эта секция

В нем говорилось, что работает консольное приложение C ++, джойстик управления движением мыши и щелчком мыши. Но я получаю C2061 необъявленный идентификатор ошибки.

Вот код, который я изменяю в консольном приложении C ++:

// TestJoyConsole.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"#include <iostream>
#include <cstdio>
#ifndef D_INPUT
#define D_INPUT
#include <dinput.h>
#endif

LPDIRECTINPUT8 di;
HRESULT hr;
LPDIRECTINPUTDEVICE8 joystick;
DIDEVICEINSTANCE pdidi;
DIDEVICEINSTANCE info;

BOOL CALLBACK
enumAxesCallback(const DIDEVICEOBJECTINSTANCE* instance, VOID* context)
{
HWND hDlg = (HWND)context;

DIPROPRANGE propRange;
propRange.diph.dwSize = sizeof(DIPROPRANGE);
propRange.diph.dwHeaderSize = sizeof(DIPROPHEADER);
propRange.diph.dwHow = DIPH_BYID;
propRange.diph.dwObj = instance->dwType;
propRange.lMin = -50;
propRange.lMax = +50;

if (FAILED(joystick->SetProperty(DIPROP_RANGE, &propRange.diph))) {
return DIENUM_STOP;
}

return DIENUM_CONTINUE;
}

BOOL CALLBACK
enumCallback(const DIDEVICEINSTANCE* instance, VOID* context)
{
HRESULT hr;

hr = di->CreateDevice(instance->guidInstance, &joystick, NULL);

if (FAILED(hr)) {
return DIENUM_CONTINUE;
}
return DIENUM_STOP;
}int _tmain(int argc, _TCHAR* argv[])
{

int counter = 0;
while (counter++ <= 100)
{
Joy* q1 = new Joy();
q1 -> start();

system("PAUSE");
return 0;
}
}class Joy
{
public:

HRESULT
poll(DIJOYSTATE *js)
{
HRESULT    hr;

if (joystick == NULL)
{
return S_OK;
}

// Poll the device to read the current state
hr = joystick->Poll();
if (FAILED(hr)) {
// DInput is telling us that the input stream has been
// interrupted. We aren't tracking any state between polls, so
// we don't have any special reset that needs to be done. We
// just re-acquire and try again.
hr = joystick->Acquire();
while (hr == DIERR_INPUTLOST) {
hr = joystick->Acquire();
}

// If we encounter a fatal error, return failure.
if ((hr == DIERR_INVALIDPARAM) || (hr == DIERR_NOTINITIALIZED)) {
return E_FAIL;
}

// If another application has control of this device, return successfully.
// We'll just have to wait our turn to use the joystick.
if (hr == DIERR_OTHERAPPHASPRIO) {
return S_OK;
}
}
// Get the input's device state
if (FAILED(hr = joystick->GetDeviceState(sizeof(DIJOYSTATE), js))) {
return hr; // The device should have been acquired during the Poll()
}

return S_OK;
}
void GetDesktopResolution(int& horizontal, int& vertical)
{
RECT desktop;

// Get a handle to the desktop window
const HWND hDesktop = GetDesktopWindow();

// Get the size of screen to the variable desktop
GetWindowRect(hDesktop, &desktop);

horizontal = desktop.right;
vertical = desktop.bottom;
}

void moveMouse(int dx, int dy)
{
POINT pt;
int horizontal = 0;
int vertical = 0;

GetDesktopResolution(horizontal, vertical);

GetCursorPos(&pt);

pt.x += dx;
pt.y += dy;

if (pt.x < 0)
{
pt.x = 0;
}
if (pt.x > horizontal)
{
pt.x = horizontal;
}

if (pt.y < 0)
{
pt.y = 0;
}
if (pt.y > vertical)
{
pt.y = vertical;
}

SetCursorPos(pt.x, pt.y);
}

void clickMouse()
{
if (GetKeyState(VK_LBUTTON) >= 0)
{
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
}
}
void unclickMouse()
{
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}

void close()
{
if (joystick)
{
joystick->Unacquire();
}
}

int start()
{
DIJOYSTATE js;                                        // struktura stanu joysticka

// Create a DirectInput device
if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,
IID_IDirectInput8, (VOID**)&di, NULL))) {
return hr;
}

if (FAILED(hr = di->EnumDevices(DI8DEVCLASS_GAMECTRL, enumCallback,
NULL, DIEDFL_ATTACHEDONLY))) {
return hr;
}

// sprawdzenie czy jest joystick
if (joystick == NULL) {

std::cout << "Joystick not found.\n";
system("pause");
return E_FAIL;
}

// ustawienia
DIDEVCAPS capabilities;

// zdefiniowanie formatu danych urzadzenia
if (FAILED(hr = joystick->SetDataFormat(&c_dfDIJoystick)))
{
return hr;
}

// Powiazanie urzadzenia z oknem aplikacji
if (FAILED(hr = joystick->SetCooperativeLevel(GetConsoleWindow(), DISCL_NONEXCLUSIVE | DISCL_FOREGROUND))) {
return hr;
}

// wczytanie ustawien joysticka
capabilities.dwSize = sizeof(DIDEVCAPS);
if (FAILED(hr = joystick->GetCapabilities(&capabilities))) {

return hr;
}

// wyliczanie
if (FAILED(hr = joystick->EnumObjects(enumAxesCallback, NULL, DIDFT_AXIS))) {
return hr;
}

info.dwSize = sizeof(DIDEVICEINSTANCE);
if (FAILED(hr = joystick->GetDeviceInfo(&info)))
{
return hr;
}
int i = 0;
while (i < MAX_PATH && info.tszProductName[i] != 0)
{
std::cout << (char)info.tszProductName[i];
i++;
}
std::cout << std::endl;
system("pause");

while (1)
{
poll(&js);

if (js.rgbButtons[0] != 0)

clickMouse();

else
unclickMouse();
//clickMouse(js.rgbButtons[0]);

for (int i = 0; i < 11; i++)
{
if (js.rgbButtons[i] != 0) std::cout << "Przycisk " << i + 1 << std::endl;
}std::cout << "X: " << js.lX << std::endl;
std::cout << "Y: " << js.lY << std::endl;
std::cout << "Z: " << js.lZ << std::endl;

moveMouse(js.lX, js.lY);
printf("A\n");

//Sleep(400);
std::cout << std::endl;
system("cls");
}

close();

system("pause");
}
};

Операционная система Windows 7 Ultimate x32bit, компилируется с Visual Studio C ++ 2013

Сообщение об ошибке: Ошибка 1, ошибка C2065: «Радость»: не объявлено
идентификатор c: \ users \ amidisglobal \ documents \ visual studio
2013 \ projects \ test_joyconcolse \ testjoyconsole \ testjoyconsole \ testjoyconsole.cpp 62 1 TestJoyConsole

Ошибка 2: ошибка C2065: «q1»: не объявлено
идентификатор c: \ users \ amidisglobal \ documents \ visual studio
2013 \ projects \ test_joyconcolse \ testjoyconsole \ testjoyconsole \ testjoyconsole.cpp 62 1 TestJoyConsole

Ошибка 3 ошибка C2061: синтаксическая ошибка: идентификатор
«Радость» c: \ users \ amidisglobal \ Documents \ visual studio
2013 \ projects \ test_joyconcolse \ testjoyconsole \ testjoyconsole \ testjoyconsole.cpp 62 1 TestJoyConsole

Ошибка 4: ошибка C2065: «q1»: не объявлено
идентификатор c: \ users \ amidisglobal \ documents \ visual studio
2013 \ projects \ test_joyconcolse \ testjoyconsole \ testjoyconsole \ testjoyconsole.cpp 63 1 TestJoyConsole

Ошибка 5 Ошибка C2227: слева от «-> Пуск» должен указывать на
класс / структура / объединение / универсальный тип c: \ users \ amidisglobal \ documents \ visual
студия
2013 \ projects \ test_joyconcolse \ testjoyconsole \ testjoyconsole \ testjoyconsole.cpp 63 1 TestJoyConsole

РЕДАКТИРОВАТЬ:

// TestJoyConsole.cpp: Определяет точку входа для консольного приложения.
//

#include "stdafx.h"#include <iostream>
#include <cstdio>
#include <InitGuid.h>
#ifndef D_INPUT
#define D_INPUT
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
#endif

LPDIRECTINPUT8 di;
HRESULT hr;
LPDIRECTINPUTDEVICE8 joystick;
DIDEVICEINSTANCE pdidi;
DIDEVICEINSTANCE info;

BOOL CALLBACK
enumAxesCallback(const DIDEVICEOBJECTINSTANCE* instance, VOID* context)
{
HWND hDlg = (HWND)context;

DIPROPRANGE propRange;
propRange.diph.dwSize = sizeof(DIPROPRANGE);
propRange.diph.dwHeaderSize = sizeof(DIPROPHEADER);
propRange.diph.dwHow = DIPH_BYID;
propRange.diph.dwObj = instance->dwType;
propRange.lMin = -50;
propRange.lMax = +50;

if (FAILED(joystick->SetProperty(DIPROP_RANGE, &propRange.diph))) {
return DIENUM_STOP;
}

return DIENUM_CONTINUE;
}

BOOL CALLBACK
enumCallback(const DIDEVICEINSTANCE* instance, VOID* context)
{
HRESULT hr;

hr = di->CreateDevice(instance->guidInstance, &joystick, NULL);

if (FAILED(hr)) {
return DIENUM_CONTINUE;
}
return DIENUM_STOP;
}class Joy
{
public:

HRESULT
poll(DIJOYSTATE *js)
{
HRESULT    hr;

if (joystick == NULL)
{
return S_OK;
}

// Poll the device to read the current state
hr = joystick->Poll();
if (FAILED(hr)) {
// DInput is telling us that the input stream has been
// interrupted. We aren't tracking any state between polls, so
// we don't have any special reset that needs to be done. We
// just re-acquire and try again.
hr = joystick->Acquire();
while (hr == DIERR_INPUTLOST) {
hr = joystick->Acquire();
}

// If we encounter a fatal error, return failure.
if ((hr == DIERR_INVALIDPARAM) || (hr == DIERR_NOTINITIALIZED)) {
return E_FAIL;
}

// If another application has control of this device, return successfully.
// We'll just have to wait our turn to use the joystick.
if (hr == DIERR_OTHERAPPHASPRIO) {
return S_OK;
}
}
// Get the input's device state
if (FAILED(hr = joystick->GetDeviceState(sizeof(DIJOYSTATE), js))) {
return hr; // The device should have been acquired during the Poll()
}

return S_OK;
}
void GetDesktopResolution(int& horizontal, int& vertical)
{
RECT desktop;

// Get a handle to the desktop window
const HWND hDesktop = GetDesktopWindow();

// Get the size of screen to the variable desktop
GetWindowRect(hDesktop, &desktop);

horizontal = desktop.right;
vertical = desktop.bottom;
}

void moveMouse(int dx, int dy)
{
POINT pt;
int horizontal = 0;
int vertical = 0;

GetDesktopResolution(horizontal, vertical);

GetCursorPos(&pt);

pt.x += dx;
pt.y += dy;

if (pt.x < 0)
{
pt.x = 0;
}
if (pt.x > horizontal)
{
pt.x = horizontal;
}

if (pt.y < 0)
{
pt.y = 0;
}
if (pt.y > vertical)
{
pt.y = vertical;
}

SetCursorPos(pt.x, pt.y);
}

void clickMouse()
{
if (GetKeyState(VK_LBUTTON) >= 0)
{
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
}
}
void unclickMouse()
{
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}

void close()
{
if (joystick)
{
joystick->Unacquire();
}
}

int start()
{
DIJOYSTATE js;                                        // struktura stanu joysticka

// Create a DirectInput device
if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,
IID_IDirectInput8, (VOID**)&di, NULL))) {
return hr;
}

if (FAILED(hr = di->EnumDevices(DI8DEVCLASS_GAMECTRL, enumCallback,
NULL, DIEDFL_ATTACHEDONLY))) {
return hr;
}

// sprawdzenie czy jest joystick
if (joystick == NULL) {

std::cout << "Joystick not found.\n";
system("pause");
return E_FAIL;
}

// ustawienia
DIDEVCAPS capabilities;

// zdefiniowanie formatu danych urzadzenia
if (FAILED(hr = joystick->SetDataFormat(&c_dfDIJoystick)))
{
return hr;
}

// Powiazanie urzadzenia z oknem aplikacji
if (FAILED(hr = joystick->SetCooperativeLevel(GetConsoleWindow(), DISCL_NONEXCLUSIVE | DISCL_FOREGROUND))) {
return hr;
}

// wczytanie ustawien joysticka
capabilities.dwSize = sizeof(DIDEVCAPS);
if (FAILED(hr = joystick->GetCapabilities(&capabilities))) {

return hr;
}

// wyliczanie
if (FAILED(hr = joystick->EnumObjects(enumAxesCallback, NULL, DIDFT_AXIS))) {
return hr;
}

info.dwSize = sizeof(DIDEVICEINSTANCE);
if (FAILED(hr = joystick->GetDeviceInfo(&info)))
{
return hr;
}
int i = 0;
while (i < MAX_PATH && info.tszProductName[i] != 0)
{
std::cout << (char)info.tszProductName[i];
i++;
}
std::cout << std::endl;
system("pause");

while (1)
{
poll(&js);

if (js.rgbButtons[0] != 0)

clickMouse();

else
unclickMouse();
//clickMouse(js.rgbButtons[0]);

for (int i = 0; i < 11; i++)
{
if (js.rgbButtons[i] != 0) std::cout << "Przycisk " << i + 1 << std::endl;
}std::cout << "X: " << js.lX << std::endl;
std::cout << "Y: " << js.lY << std::endl;
std::cout << "Z: " << js.lZ << std::endl;

moveMouse(js.lX, js.lY);
printf("A\n");

//Sleep(400);
std::cout << std::endl;
system("cls");
}

close();

system("pause");
}
};int _tmain(int argc, _TCHAR* argv[])
{

int counter = 0;
while (counter++ <= 100)
{
Joy* q1 = new Joy();
q1->start();
delete q1;

system("PAUSE");
return 0;
}
}

Теперь получите ошибку LNK2019:

Ошибка 102 ошибка LNK2019: неразрешенный внешний символ _DirectInput8Create @ 20, указанный в функции «public: int __thiscall Joy :: start (void)» (? Start @ Joy @@ QAEHXZ)

Ошибка 103, ошибка LNK2001: неразрешенный внешний символ _c_dfDIJoystick

Ошибка 104 Ошибка LNK1120: 2 неразрешенных внешних

0

Решение

Вы объявили свой класс Joy после попытки использовать его в _tmain, Либо переместите определение выше, либо переместите объявление в заголовочный файл и включите его в начало вашего основного файла cpp.

1

Другие решения


По вопросам рекламы [email protected]