Okay guys and gals, I am absolutely 100% stumped on this one. I genuinely cannot seem to resolve this one. I've been trying for 5 days, experimenting, googling, all to no avail. I usually like to solve my own coding problems and try for as long as I can to resolve it, but this time I need some outside advice!
Basically, I'm using DirectX for my input. I have a CInput class using dinput.h to grab keyboard inputs. My compiler is MSVC++ 2010.
class CInput { private: static CInput * _instance; protected: CInput(void); public: static CInput * Instance(); virtual ~CInput(); void GetInput(); bool GetIfKeyDown(int whichkey); //true as long as key still down bool GetIfKeyDownEvent(int whichkey); //occurs only when key first pressed }; #endif // !defined(AFX_INPUT_H__9F947E83_2A3B_4B63_8675_83B41506943E__INCLUDED_) [/CODE]
CInput.cpp
[CODE] // input.cpp: implementation of the Cinput class. // //////////////////////////////////////////////////////////////////////
} CInput::~CInput() { //unaquire keyboard lpdikey->Unacquire(); lpdi->Release(); } //this method refreshes the CInput class's data on which keys are currently down //this data is stored in an array called keystate[ ] void CInput::GetInput() { //copy old keystate array int i; for (i=0;i<256;i++) { oldkeystate[i]=keystate[i]; }
if (lpdikey->GetDeviceState(256,keystate)!=DI_OK) { //error } //now check which keys are now down that weren't down last time for (i=0;i<256;i++) { if ((keystate[i]>0)&&(oldkeystate[i]==0)) { //key is now down and it wasn't before keydown[i]=1; } else { keydown[i]=0; } } }
//use this method with DirectX character constants //which are defined in dinput.h such as DIK_SPACE //relies on the GetInput( ) method being called first to //update the data on which keys are currently down //if this method doesn't seem to work then make sure you //are calling GetInput( ) first!!! bool CInput::GetIfKeyDown(int whichkey) { if ((whichkey>256)|(whichkey<0)) return 0; return (bool)(keystate[whichkey] & 0x80); } //method returns 1 or 0 depending on whether //specified key has just been pressed bool CInput::GetIfKeyDownEvent(int whichkey) { if ((whichkey>256)|(whichkey<0)) return 0; return (bool)(keydown[whichkey]); } CInput * CInput::Instance() { if (0==_instance) {_instance=new CInput(); } return _instance; } CInput * CInput::_instance=0;
[/CODE]
When I go to make a build, however, it compiles the code but throws up the linker error which I told you about. Here's my output from building:
From what I've read, LNK2019 usually gets thrown when something isn't being included in your project or hasn't been defined. However, the CInput Constructor has definitely been defined in my header, with both CInput.h and CInput.cpp included in my project. DirectX SDK is definitely installed, my Linker Input in my Project Properties includes dxguid.lib, dinput.lib and dinput8.lib. My VC++ Directories for Input and Libraries explicitly include DirectX SDK's folders for Input and Libraries. I've gone through everything I can think of, but everything seems to be in place. I presume it's some sort of compiler issue of some kind, and one that's probably beyond my expertise. However, I'm open to any suggestions. I'm returning to programming after a fair few months of inactivity and so I'm a little rusty, which probably hasn't helped me solve this issue.
This is exactly why I keep saying we are not ready for human free self-driving. These little "bugs" are may seem like random one-offs. There was also the Waymo that drove between police with drawn guns and the suspect they were pointing them at.
From a software perspective it is easy to understand how those extremely rare situations may not have been programed for, but that is the point. If AI needs to be told to watch out for every possible contingency, then it can never be successful. There will always be the possibility of a first encounter that the AI needs to understand to avoid.
TeraCopy 4.0 Final by Razvan Serea
TeraCopy is a compact program designed to copy and move files at the maximum possible speed, also providing you with a lot of features.
Copy files faster. TeraCopy uses dynamically adjusted buffers to reduce seek times. Asynchronous copy speeds up file transfer between two physical hard drives.
Pause and resume transfers. Pause copy process at any time to free up system resources and continue with a single click.
Error recovery. In case of copy error, TeraCopy will try several times and in the worse case just skips the file, not terminating the entire transfer.
Interactive file list. TeraCopy shows failed file transfers and lets you fix the problem and recopy only problem files.
Shell integration. TeraCopy can completely replace Explorer copy and move functions, allowing you work with files as usual.
TeraCopy is free for non-commercial use only. For commercial use you need to buy a license. The paid version of the program includes the following features:
Copy/move to your favorite folders.
Save reports as HTML and CSV files.
Select files with the same extension/folder.
Remove the selected files from the copy queue.
Download: TeraCopy 4.0 | 14.6MB (Freeware, paid upgrade available)
View: TeraCopy Website | Screenshot
Get alerted to all of our Software updates on Twitter at @NeowinSoftware
Recycle Bin has been broken for literal YEARS now. The setting to delete files older than 30 days from the bin which is on by default doesn't even work. I have files older than 4 months in it and they are just there still...
Question
The Teej
Okay guys and gals, I am absolutely 100% stumped on this one. I genuinely cannot seem to resolve this one. I've been trying for 5 days, experimenting, googling, all to no avail. I usually like to solve my own coding problems and try for as long as I can to resolve it, but this time I need some outside advice!
Basically, I'm using DirectX for my input. I have a CInput class using dinput.h to grab keyboard inputs. My compiler is MSVC++ 2010.
CInput.h
CInput.cpp
// input.cpp: implementation of the Cinput class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Input.h"
#include <windows.h>
#include <OBJBASE.H>
extern HWND g_hWnd;
extern HINSTANCE hInst;
LPDIRECTINPUT lpdi; //pointer to direct input object
LPDIRECTINPUTDEVICE lpdikey; //the keyboard device
//storage for keyboard state
UCHAR keystate[256];
UCHAR oldkeystate[256];
bool keydown[256];
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CInput::CInput()
{
if (DirectInputCreateA(hInst, DIRECTINPUT_VERSION, &lpdi, NULL)!=DI_OK)
{
// DirectInput not available; take appropriate action
}
//create keyboard device
if(lpdi->CreateDevice(GUID_SysKeyboard, &lpdikey, NULL)!=DI_OK)
{
//error
}
//set cooperation level
if(lpdikey->SetCooperativeLevel(g_hWnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE)!=DI_OK)
{
//error
}
//set data format
if(lpdikey->SetDataFormat(&c_dfDIKeyboard)!=DI_OK)
{
//error
}
//acquire the keyboard device
if(lpdikey->Acquire()!=DI_OK)
{
//error
}
}
CInput::~CInput()
{
//unaquire keyboard
lpdikey->Unacquire();
lpdi->Release();
}
//this method refreshes the CInput class's data on which keys are currently down
//this data is stored in an array called keystate[ ]
void
CInput::GetInput()
{
//copy old keystate array
int i;
for (i=0;i<256;i++)
{
oldkeystate[i]=keystate[i];
}
if (lpdikey->GetDeviceState(256,keystate)!=DI_OK)
{
//error
}
//now check which keys are now down that weren't down last time
for (i=0;i<256;i++)
{
if ((keystate[i]>0)&&(oldkeystate[i]==0))
{
//key is now down and it wasn't before
keydown[i]=1;
}
else
{
keydown[i]=0;
}
}
}
//use this method with DirectX character constants
//which are defined in dinput.h such as DIK_SPACE
//relies on the GetInput( ) method being called first to
//update the data on which keys are currently down
//if this method doesn't seem to work then make sure you
//are calling GetInput( ) first!!!
bool
CInput::GetIfKeyDown(int whichkey)
{
if ((whichkey>256)|(whichkey<0)) return 0;
return (bool)(keystate[whichkey] & 0x80);
}
//method returns 1 or 0 depending on whether
//specified key has just been pressed
bool
CInput::GetIfKeyDownEvent(int whichkey)
{
if ((whichkey>256)|(whichkey<0)) return 0;
return (bool)(keydown[whichkey]);
}
CInput * CInput::Instance()
{
if (0==_instance)
{_instance=new CInput();
}
return _instance;
}
CInput * CInput::_instance=0;
[/CODE]
When I go to make a build, however, it compiles the code but throws up the linker error which I told you about. Here's my output from building:
1> Generating Code...
1>Input.obj : error LNK2019: unresolved external symbol _DirectInputCreateA@16 referenced in function "protected: __thiscall CInput::CInput(void)" (??0CInput@@IAE@XZ)
1>D:\Developer\ttSideScrollerWin32 - 2011 version\Debug\ttSideScrollerWin32.exe : fatal error LNK1120: 1 unresolved externals
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
[/CODE]
From what I've read, LNK2019 usually gets thrown when something isn't being included in your project or hasn't been defined. However, the CInput Constructor has definitely been defined in my header, with both CInput.h and CInput.cpp included in my project. DirectX SDK is definitely installed, my Linker Input in my Project Properties includes dxguid.lib, dinput.lib and dinput8.lib. My VC++ Directories for Input and Libraries explicitly include DirectX SDK's folders for Input and Libraries. I've gone through everything I can think of, but everything seems to be in place. I presume it's some sort of compiler issue of some kind, and one that's probably beyond my expertise. However, I'm open to any suggestions. I'm returning to programming after a fair few months of inactivity and so I'm a little rusty, which probably hasn't helped me solve this issue.
So, please Neowin, help me!!!
Link to comment
https://www.neowin.net/forum/topic/1123272-cmsvc-cannot-resolve-this-linker-error-lnk2019-directx-related/Share on other sites
2 answers to this question
Recommended Posts