2015-05-13 8 views
0

Я пытаюсь скомпилировать код из this sectionVisual 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, компилировать с визуальной студией C++ 2013

Сообщение об ошибке: Ошибка 1 Ошибка C2065: 'Joy': uneclared идентификатор c: \ users \ amidisglobal \ documents \ visual studio 2013 \ projects \ test_joyconcolse \ testjoyconsole \ testjoyconsole \ testjoyconsole.cpp 62 1 TestJoyConsole

Ошибка 2 Ошибка C2065: 'q1': необъявленная идентификатор C: \ Users \ amidisglobal \ документы \ Visual Studio 2013 \ проекты \ test_joyconcolse \ testjoyconsole \ testjoyconsole \ testjoyconsole.cpp 62 1 TestJoyConsole

Ошибка 3 Ошибка C2061 : синтаксическая ошибка: идентификатор 'Джой' C: \ Users \ amidisglobal \ документы \ Visual Studio 2013 \ проекты \ test_joyconcolse \ testjoyconsole \ testjoyconsole \ testjoyconsole.cpp 62 1 testJoyConsole

ошибка 4 ошибка C2065: 'q1': uneclared идентификатор c: \ users \ amidisglobal \ документы \ визуальная студия 2013 \ projects \ te st_joyconcolse \ testjoyconsole \ testjoyconsole \ testjoyconsole.cpp 63 1 TestJoyConsole

Ошибка 5 Ошибка C2227: слева от '-> Start' должен указывать на класс/структура/объединение/универсальный тип C: \ Users \ amidisglobal \ документы \ визуальный студия 2013 \ Projects \ test_joyconcolse \ testjoyconsole \ testjoyconsole \ testjoyconsole.cpp 63 1 testJoyConsole

EDIT:

// 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 ссылочного в функции "общественного: междунар __thiscall Joy :: начать (пустоту)" (? начать @ Joy @@ QAEHXZ)

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

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

ответ

1

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

+0

что решить ошибку C2061, но теперь появляются ошибки 102 \t ошибка LNK2019: неразрешенный внешний символ _DirectInput8Create @ 20 ссылается на функцию "общественность: ИНТ __thiscall Joy :: заводится (пустоту)" –

+0

Ну (старт @ Joy @@ QAEHXZ?) вы создали переменную 'Joy * q1 = new Joy();' затем вызвали этот метод 'q1-> start();' но я не вижу, чтобы вы когда-либо определяли 'Joy :: start', так как вы можете вызов этого метода? – CoryKramer

+0

Я вижу только свободную функцию 'start', но это не член' Joy', поэтому вы не можете называть ее как 'q1-> start()', вы просто вызываете 'start();' – CoryKramer