Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations strongm on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Joystick code won't compile 1

Status
Not open for further replies.

stato10

Programmer
May 3, 2005
8
US
Hi I wondered if anyone could help I am trying to compile the following code but for some reason I am getting a number of errors which I dont understand

*************************************
Joystick.cpp
*************************************

#define STRICT
#define DIRECTINPUT_VERSION 0x0800


#include <windows.h>
#include <commctrl.h>
#include <basetsd.h>
#include <dinput.h>
#include "resource.h"
#include "zserial.h"

#include <string>

//Variables
int CommPort = 8, BaudRate = 38400;
int range = 2, HornValue = 0;

//Function prototypes
INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK EnumObjectsCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext );
BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext );
HRESULT InitDirectInput ( HWND hDlg );
VOID FreeDirectInput ();
HRESULT UpdateInputState ( HWND hDlg );

//Defines, constants, and global variables
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }

LPDIRECTINPUT8 g_pDI = NULL;
LPDIRECTINPUTDEVICE8 g_pJoystick = NULL;

// Name: WinMainO
// Desc: Entry point for the application. Since we use a simple dialog for
// user interaction we don't need to pump messages.
int APIENTRY WinMain ( HINSTANCE hInst, HINSTANCE, LPSTR, int )
{
InitCommonControls();

// Display the main dialog box.
DialogBox( hInst, MAKEINTRESOURCE(IDD_JOYST_IMM), NULL, MainDlgProc );

return TRUE;
}

// Name: MainDialogProc
// Desc: Handles dialog messages

INT_PTR CALLBACK MainDlgProc ( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_INITDIALOG:
if ( FAILED( InitDirectInput ( hDlg ) ) )
{
MessageBox( NULL, TEXT("Error Initializing DirectInput" ), TEXT ("DirectInput Sample"), MB_ICONERROR | MB_OK ); EndDialog( hDlg, 0 ) ;
}

//Open comm at correct baudrate
zSerialOpen(CommPort, BaudRate, 0, 8, 1);

//Set a timer to go off 30 times a second. At every timer message //the input device will be read
SetTimer( hDlg, 0, 1000 / 30, NULL );
return TRUE;

case WM_ACTIVATE:
if ( WA_INACTIVE != wParam && g_pJoystick )
{
// Make sure the device is acquired, if we are gaining focus.
g_pJoystick->Acquire() ;
}
return TRUE;

case WM_TIMER:
// Update the input device every timer message
if ( FAILED( UpdateInputState( hDlg ) ) )
{
KillTimer( hDlg, 0 );
MessageBox( NULL, TEXT("Error Reading Input State. ") \
TEXT("The sample will now exit."), TEXT("DirectInput Sample"), MB_ICONERROR | MB_OK );
EndDialog ( hDlg, TRUE );
}
return TRUE;

case WM_COMMAND:
switch ( LOWORD(wParam) )
{
case IDCANCEL:
EndDialog( hDlg, 0 ) ;
return TRUE;
}

case WM_DESTROY:
// Cleanup everything
KillTimer( hDlg, 0 ) ;
FreeDirectInput() ;
zSerialClose(2) ;
return TRUE;
}
return FALSE; // Message not handled
}

// Name: InitDirectlnput ( )
// Desc: Initialize the Directlnput variables.
//*******************************************

HRESULT InitDirectInput( HWND hDlg )
{
HRESULT hr;

// Register with the Directlnput subsystem and get a pointer
// to a IDirectlnput interface we can use.
// Create a DInput object
if ( FAILED ( hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&g_pDI, NULL) ) )
return hr;

// Look for a simple joystick we can use for this sample program.
if ( FAILED ( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, NULL, DIEDFL_ATTACHEDONLY ) ) )
return hr;

// Make sure we got a joystick
if ( NULL == g_pJoystick )
{
MessageBox( NULL, TEXT ("Joystick not found. The sample will now exit."), TEXT ("DirectInput Sample"), MB_ICONERROR | MB_OK );
EndDialog( hDlg, 0 );
return S_OK;
}

// Set the data format to "simple joystick" - a predefined data format //
// A data format specifies which controls on a device we are interested in, // and how they should be reported. This tells DInput that we will be // passing a DIJOYSTATE2 structure to IDirectlnputDevice: :GetDeviceState () .

if ( FAILED ( hr = g_pJoystick->SetDataFormat( &c_dfDIJoystick2 ) ) )
return hr;

// Set the cooperative level to let DInput know how this device should
// interact with the system and with other DInput applications.
if ( FAILED ( hr = g_pJoystick->SetCooperativeLevel ( hDlg, DISCL_EXCLUSIVE | DISCL_FOREGROUND ) ) )
return hr;

// Enumerate the joystick objects. The callback function enabled user // interface elements for objects that are found, and sets the min/max // values property for discovered axes.
if ( FAILED( hr = g_pJoystick->EnumObjects( EnumObjectsCallback, (VOID*) hDlg, DIDFT_ALL ) ) )
return hr;

return S_OK;
}
//
// Name: EnumJoysticksCallback ()
// Desc: Called once for each enumerated joystick. If we find one, create a
// device interface on it so we can play with it.
//
BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext )
{
HRESULT hr;

// Obtain an interface to the enumerated joystick.
hr = g_pDI->CreateDevice ( pdidInstance->guidInstance, &g_pJoystick, NULL );

// If it failed, then we can't use this joystick. (Maybe the user unplugged // it while we were in the middle of enumerating it.)
if ( FAILED (hr) )
return DIENUM_CONTINUE;


// Stop enumeration. Note: we're just taking the first joystick we get. You // could store all the enumerated joysticks and let the user pick.
return DIENUM_STOP;
}

//* Name: EnumObjectsCallback()
//* Desc: Callback function for enumerating objects (axes, buttons, POVs) on a
//* joystick. This function enables user interface elements for objects
//* that are found to exist, and scales axes min/max values.

BOOL CALLBACK EnumObjectsCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext )
{
HWND hDlg = (HWND)pContext;
static int nSliderCount =0; // Number of returned slider controls
static int nPOVCount = 0; // Number of returned POV controls

// For axes that are returned, set the DIPROP_RANGE property for the // enumerated axis in order to scale min/max values.
if ( pdidoi->dwType & DIDFT_AXIS )
{
DIPROPRANGE diprg;
diprg.diph.dwSize = sizeof(DIPROPRANGE);
diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER);
diprg.diph.dwHow = DIPH_BYID;
diprg.diph.dwObj = pdidoi->dwType; // Specify the enumerated axis
diprg.lMin = -1000;
diprg.lMax = +1000;

// Set the range for the axis
if ( FAILED( g_pJoystick->SetProperty( DIPROP_RANGE, &diprg.diph ) ) ) return DIENUM_STOP;
}

// Set the UI to reflect what objects the joystick supports
if (pdidoi->guidType == GUID_XAxis)
{
EnableWindow( GetDlgItem( hDlg, IDC_X_AXIS ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_X_AXIS_TEXT ), TRUE );
}
if (pdidoi->guidType == GUID_YAxis)
{
EnableWindow( GetDlgItem( hDlg, IDC_Y_AXIS ), TRUE ) ;
EnableWindow( GetDlgItem( hDlg, IDC_Y_AXIS_TEXT ), TRUE );
}
if (pdidoi->guidType == GUID_RzAxis)
{
EnableWindow( GetDlgItem( hDlg, IDC_Z_ROT ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_Z_ROT_TEXT ), TRUE );
}
if (pdidoi->guidType == GUID_Slider)
{
EnableWindow( GetDlgItem( hDlg, IDC_SLIDER0 ), TRUE ) ;
EnableWindow( GetDlgItem( hDlg, IDC_SLIDER0_TEXT ), TRUE );
}
if (pdidoi->guidType == GUID_POV)
{
EnableWindow( GetDlgItem( hDlg, IDC_POV0 ), TRUE ) ;
EnableWindow( GetDlgItem( hDlg, IDC_POV0_TEXT ), TRUE ) ;
}

return DIENUM_CONTINUE;
}

//* Name: UpdatelnputState ( )
//* Desc: Get the input device's state and display it.

HRESULT UpdateInputState ( HWND hDlg )
{
HRESULT hr;
TCHAR strText[512]; // Device state text
DIJOYSTATE2 js; // DInput joystick state
TCHAR* str;

if ( NULL == g_pJoystick )
return S_OK;

// Poll the device to read the current state
hr = g_pJoystick->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 = g_pJoystick->Acquire();
while ( hr == DIERR_INPUTLOST )
hr = g_pJoystick->Acquire();

// hr may be DIERR_OTHERAPPHASPRIO or other errors. This // may occur when the app is minimized or in the process of // switching, so just try again later
return S_OK;
}

// Get the input's device state
if ( FAILED ( hr = g_pJoystick->GetDeviceState ( sizeof (DIJOYSTATE2) , &js ) ) )
return hr; // The device should have been acquired during the Poll()

// Display joystick state to dialog

// Axes
wsprintf( strText, TEXT("%ld") , js.lX );
SetWindowText( GetDlgItem( hDlg, IDC_X_AXIS ), strText );
wsprintf( strText, TEXT("%ld"), js.lY );
SetWindowText( GetDlgItem( hDlg, IDC_Y_AXIS ), strText );
wsprintf ( strText, TEXT ("%ld") , js.lRz );
SetWindowText( GetDlgItem( hDlg, IDC_Z_ROT ), strText );

// Slider controls
wsprintf( strText, TEXT("%ld"), js.rglSlider[0] );
SetWindowText( GetDlgItem( hDlg, IDC_SLIDER0 ), strText );

// Points of view
wsprintf( strText, TEXT("%ld"), js.rgdwPOV[0] );
SetWindowText( GetDlgItem( hDlg, IDC_POV0 ), strText );

// Fill up text with which buttons are pressed
str = strText;
for( int i = 0; i < 128; i++ )
{
if ( js.rgbButtons & 0x80 )
str += wsprintf( str, TEXT("%02d "), i );
}
*str = 0; // Terminate the string
SetWindowText( GetDlgItem( hDlg, IDC_BUTTONS ), strText );

//Temp variables
char temp[7];
int tempaxis = 0;

//Change gear range if button 2 or 3 is pressed
if ( js.rgbButtons[3] & 0x80 )
{
range = 3;
SetWindowText( GetDlgItem( hDlg, IDC_TEST3 ), "LOW" );
}
if ( js.rgbButtons[2] & 0x80 )
{
range = 1;
SetWindowText( GetDlgItem( hDlg, IDC_TEST3 ), "HIGH" );
}

//Turn horn on while button 1 is pressed
if ( (js.rgbButtons[1] & 0x80) && !HornValue )
{
HornValue = 1;
wsprintf( temp, TEXT("H %d\n"), 1 );
zSerialWrite(CommPort, temp, 7);
}
else if ( !(js.rgbButtons[1] & 0x80) && HornValue )
{
HornValue = 0;
wsprintf( temp, TEXT("H %d\n"), 0 );
zSerialWrite(CommPort, temp, 7);
}

//Apply emergency brake if button 0 is pressed
if ( js.rgbButtons[0] & 0x80 )
{
wsprintf( temp, TEXT("M %d\n"), -450 );
}

//Read Y axis and congigure value
else
{
tempaxis = (js.lY*-1)/range;
if(tempaxis < 0)
{
tempaxis = -400 + (tempaxis * 0.6);
}
wsprintf( temp, TEXT("M %d\n"), tempaxis );
}

//Send control string and update window text
zSerialWrite(CommPort, temp, 7);
SetWindowText( GetDlgItem( hDlg, IDC_TEST ), temp );

//Read X axis, send control string and update window text
wsprintf( temp, TEXT("S %d\n"), js.lX );
zSerialWrite(CommPort, temp, 7);
SetWindowText( GetDlgItem( hDlg, IDC_TEST2 ), temp );

//Read ranger
//zSerialRead(2, temp, 7, I);
//SetWindowText( GetDlgItem( hDlg, IDC_TEST3 ), temp );
return S_OK;
}

//***************************************
//* Name: FreeDirectlnput()
//* Desc: Initialize the Directlnput variables.
// + * + ********* + **** + *** + **** + ** + + **** + * + *

VOID FreeDirectInput()
{
// Unacquire the device one last time just in case
// the app tried to exit while the device is still acquired.
if( g_pJoystick )
g_pJoystick->Unacquire();

// Release any Directlnput objects.
SAFE_RELEASE( g_pJoystick );
SAFE_RELEASE( g_pDI );
}

******************************************
zserial.h
******************************************

#ifdef ZSERIAL_H
#define ZSERIAL_H

int zSerialOpen( int port, int speed, int parity, int bits, int stopBits ) ;
// Open the serial port

void zSerialClose ( int port ) ;
// Close the serial port

int zSerialRead( int port, char *buffer, int max, int blocking ) ;
// zSerialRead will block if requested until some data arrives
// Returns -1 on an error, 0 for no data, or data count on a successful
read
// When non blocking, it will return 0 if there is nothing to read.
int zSerialReadCount ( int port, char *buffer, int count ) ;
// zSerialReadCount will block until it has received count
// bytes from the port.

int zSerialWrite ( int port, char *buffer, int len );
// Writes the data to the port

void zSerialEscapeFunction( int port, int function);
// These macros are stolen from
#define zSerialSETXOFF 1 // Simulate XOFF received
#define zSerialSETXON 2 // Simulate XON received
#define zSerialSETRTS 3 // Set RTS high
#define zSerialCLRRTS 4 // Set RTS low
#define zSerialSETDTR 5 // Set DTR high
#define zSerialCLRDTR 6 // Set DTR low
#define zSerialRESETDEV 7 // Reset device if possible
#define zSerialSETBREAK 8 // Set the device break line
#define zSerialCLRBREAK 9 // Clear the device break line


#endif


******************************************
zserial.cpp
******************************************

#include "windows.h"
#include "winioctl.h"
#include "assert.h"
#include "zserial.h"

struct ZSeriallnfo
{
HANDLE handle;
int connected;
int port;
};

#define MAX_SERIAL_PORTS 8
static ZSeriallnfo serialPorts [MAX_SERIAL_PORTS] ;

// * * zSerialWrite *********************************************************/
int zSerialWrite ( int port, char *buffer, int len )
{
ZSeriallnfo *serialInfo = &serialPorts [port] ;
unsigned long bytesWritten = 0;
int ok = WriteFile( serialInfo->handle, buffer, len, &bytesWritten, NULL );
if( !ok ) {
return 0;
}
return bytesWritten;
}

//* * zSerialOpen **********************************************************/
int zSerialOpen( int port, int speed, int parity, int bits, int stopBits )
{

// Open a one-based port
assert ( ! serialPorts [port].connected );

memset ( &serialPorts [port] , 0, sizeof (ZSeriallnfo) );
serialPorts [port].port = port;

char portName[5] = "COM ";
portName[3] = port + '0';

// open COMM device
serialPorts [port].handle = CreateFile (portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL /* | FILE_FLAG_OVERLAPPED*/, NULL );
DCB dcb;
dcb.DCBlength = sizeof( DCB );
GetCommState ( serialPorts [port].handle, &dcb );

dcb.BaudRate = speed; // current baud rate
dcb.fBinary = 0; // binary mode, no EOF check
dcb.fParity = 1; // enable parity checking
dcb.fOutxCtsFlow = 0; // CTS output flow control
dcb.fOutxDsrFlow = 0; // DSR output flow control
dcb.fDtrControl = DTR_CONTROL_DISABLE; // DTR flow control type
dcb.fDsrSensitivity = 0; // DSR sensitivity
dcb.fTXContinueOnXoff = 0; // XOFF continues Tx
dcb.fOutX = 0; // XON/XOFF out flow control
dcb.fInX = 0; // XON/XOFF in flow control
dcb.fErrorChar = 0; // enable error replacement
dcb.fNull = 0; // enable null stripping
dcb.fRtsControl = RTS_CONTROL_DISABLE; // RTS flow control
dcb.fAbortOnError = 0; // abort reads/writes on error deb.fDummy2 = 0; // reserved
dcb.wReserved = 0; // not currently used
dcb.XonLim = 2048; // transmit XON threshold
dcb.XoffLim = 512; // transmit XOFF threshold
dcb.ByteSize = bits; // number of bits/byte, 4-8
dcb.Parity = parity; // 0-4=no,odd,even,mark,space
dcb.StopBits = stopBits-1; // 0, 1, 2 = 1, 1.5, 2
dcb.XonChar = 0x11; // Tx and Rx XON character
dcb.XoffChar = 0x13; // Tx and Rx XOFF character
dcb.ErrorChar = 0; // error replacement character
dcb.EofChar = 0; // end of input character
dcb.EvtChar = 0; // received event character
dcb.wReserved1 = 0; // reserved do not use

int ret = SetCommState ( serialPorts[port].handle, &dcb );

// setup device buffers
SetupComm( serialPorts[port].handle, 8192, 100 );


EscapeCommFunction( serialPorts[port].handle, SETDTR );
EscapeCommFunction ( serialPorts[port].handle, SETRTS );

// get any early notifications
SetCommMask ( serialPorts[port].handle, EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD | EV_ERR | EV_RING );

serialPorts[port].connected = 1;

EscapeCommFunction( serialPorts[port].handle, CLRRTS );
return 1;
}

//* * zSeria lEscapeFunct ion
void zSerialEscapeFunction ( int port, int function )
{
EscapeCommFunction ( serialPorts[port].handle, function ) ;
}

// * * zSerialRead*********************************o*o*******/
int zSerialRead( int port, char *buffer, int max, int blocking )
{
if ( blocking ) {
while ( 1 ) {
unsigned long eventMask = 0;
WaitCommEvent ( serialPorts[port].handle, &eventMask, NULL );
if ( eventMask & EV_RXCHAR ) {
unsigned long bytesRead = 0;
int a = ReadFile ( serialPorts[port].handle, buffer, max, &bytesRead, NULL );
if( !a ) {
return -1;
}
return bytesRead;
}
}
}
else {
unsigned long bytesRead = 0;
int a = ReadFile ( serialPorts [port] .handle, buffer, max, &bytesRead, NULL ) ;
if( !a ) {
return -1;
}
return bytesRead;
}
return 0;
}

//** zSerialReadCount ******************************
int zSerialReadCount ( int port, char *buffer, int count )
{
int i = 0;
while ( i < count ) {
int read = zSerialRead( port, &buffer, count-i, 1 );
if ( read > 0 ) {
i += read;
}
else if( read < 0 ) {
return -1;
}
}
return count;
}

// zSerialClose **+*********+************^
void zSerialClose( int port )
{
ZSeriallnfo *p = &serialPorts[port];
if ( p->handle ) {
CloseHandle( p->handle );
p->connected = 0;
p->handle = 0;
}
}




******************************************
resource.h
******************************************
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Joystick.rc
//
#define IDI_MAIN 102
#define IDD_JOYST_IMM 103
#define IDR_ACCELERATOR1 103
#define IDC_CLOSE 1001
#define IDC_X_AXIS 1010
#define IDC_Y_AXIS 1011
#define IDC_Z_AXIS 1012
#define IDC_X_AXIS_TEXT 1013
#define IDC_Y_AXIS_TEXT 1014
#define IDC_Z_AXIS_TEXT 1015
#define IDC_X_ROT_TEXT 1016
#define IDC_Y_ROT_TEXT 1017
#define IDC_Z_ROT_TEXT 1018
#define IDC_SLIDER0_TEXT 1019
#define IDC_X_ROT 1020
#define IDC_Y_ROT 1021
#define IDC_Z_ROT 1022
#define IDC_SLIDER1_TEXT 1023
#define IDC_POV0_TEXT 1024
#define IDC_POV1_TEXT 1025
#define IDC_POV2_TEXT 1026
#define IDC_POV3_TEXT 1027
#define IDC_SLIDER0 1030
#define IDC_SLIDER1 1031
#define IDC_POV 1040
#define IDC_POV0 1040
#define IDC_BUTTONS 1041
#define IDC_POV1 1042
#define IDC_POV2 1043
#define IDC_POV3 1044
#define IDC_TEST 1045
#define IDC_TEST2 1046
#define IDC_TEST3 1047

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 104
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1025
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif



Ok the zserial.cpp compiles fine but the joystick.cpp doesnt it has problems with the line

DialogBox( hInst, MAKEINTRESOURCE(IDD_JOYST_IMM), NULL, MainDlgProc );

with the error

c:\program files\microsoft visual studio\myprojects\bluecar\joystick.cpp(41) : error C2664: 'DialogBoxParamA' : cannot convert parameter 4 from 'long (struct HWND__ *,unsigned int,unsigned int,long)' to 'int (__stdcall *)(struct HWND__ *,unsigned in
t,unsigned int,long)'
None of the functions with this name in scope match the target type

have i set up the project wrong or something??
also it comes up with errors

c:\program files\microsoft visual studio\myprojects\bluecar\joystick.cpp(60) : error C2065: 'zSerialOpen' : undeclared identifier
c:\program files\microsoft visual studio\myprojects\bluecar\joystick.cpp(97) : error C2065: 'zSerialClose' : undeclared identifier
c:\program files\microsoft visual studio\myprojects\bluecar\joystick.cpp(303) : error C2065: 'zSerialWrite' : undeclared identifier


which doesnt make sense as these were declared in zserial.h
could anyone tell me where im going wrong?
 
Hello,

I think you have a typo at the beginning of zserial.h. It should be #ifndef instead of #ifdef.
I can't help you with the other error, sorry.

Michael
 
Thanks so much michael just have one other error I dont know if you know whats wrong with this line of code

Code:
	DialogBox( hInst, MAKEINTRESOURCE(IDD_JOYST_IMM), NULL, MainDlgProc );

this is in joystick.cpp

giving error

c:\program files\microsoft visual studio\myprojects\bluecar\joystick.cpp(42) : error C2664: 'DialogBoxParamA' : cannot convert parameter 4 from 'long (struct HWND__ *,unsigned int,unsigned int,long)' to 'int (__stdcall *)(struct HWND__ *,unsigned in
t,unsigned int,long)'
None of the functions with this name in scope match the target type

 
The first parameter in the function asks for a pointer to a window handle (hWnd) instead you give him a pointer to the instance of the program (hInst).
 
The thing is the code I have is from an example from microsoft directx 9.0 sdk and it has the built exe file which works and gives the code but for some reason when i try to compile it, it comes up with this error i think the problem lies now in the dialog box and relating the box to the code. Could this be true??

Simon
 
Does the example create a window first since all the dialogbox seems to ask from you is a handle to a window.
Unfortunately i don't have c++ on my pc here at work, so i can't look it up or try it out. But i think thats the reason why your program doesnt want to run, because you don't have a window handle (hWnd).
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top