Hier geht es weiter:

cport.h:

Code:
#ifndef CPORTDLLCHEADER
#define CPORTDLLCHEADER

#include <windows.h>

//#define THEDLL "RSAPI.DLL" 
#define THEDLL "PORT.DLL"


/*******************************************************************************
** C/C++ -Class-Definitionen fuer die DLL "port.dll"
*******************************************************************************/
class CPORT 
{
public:
	CPORT () 
	{
		loaddll (THEDLL);
	};

	~CPORT () 
	{
		FreeLibrary (hDLL);
	};
	
	// Messagebox
	bool mes (char * string)
	{
		MessageBox (GetActiveWindow (), string, "DLLTEST", MB_OK | MB_ICONINFORMATION);
		return (true);
	};
	
	// RTS 
	// Setzen der seriellen Leitung RTS. Diese muss zuvor geoeffnet worden sein.
	// Parameter: Wert(0..1)
	// Rueckgabe: keine
	int rts (WORD i)
	{
		typedef int (CALLBACK* LP1INT)(WORD);
		LP1INT p; 
		p = (LP1INT)GetProcAddress (hDLL,"RTS");
		return p (i);
	};
	
	// TXD 
	// Setzen der seriellen Leitung TxD. Diese muss zuvor geoeffnet worden sein.
	// Parameter: Wert(0..1)
	// Rueckgabe: keine
	int txd (WORD i)
	{
		typedef int (CALLBACK* LP1INT)(WORD);
		LP1INT p; 
		p = (LP1INT)GetProcAddress (hDLL,"TXD");
		return p (i);
	};
	
	// DTR 
	// Setzen der seriellen Leitung DTR. Diese muss zuvor geoeffnet worden sein.
	// Parameter: Wert(0..1)
	// Rueckgabe: keine
	int dtr (WORD i)
	{
		typedef int (CALLBACK* LP1INT)(WORD);
		LP1INT p; 
		p = (LP1INT)GetProcAddress (hDLL,"DTR");
		return p (i);
	};
	
	// DSR 
	// Abfragen der seriellen Leitung DSR. Diese muss zuvor geoeffnet worden sein.
	// Parameter: keine
	// Rueckgabe: Zustand der Leitung (1/0)
	WORD dsr (void)
	{
		typedef WORD (CALLBACK* LP1INT)();
		LP1INT p; 
		p = (LP1INT)GetProcAddress (hDLL,"DSR");
		return p ();
	};
	
	// CTS
	// Abfragen der seriellen Leitung CTS. Diese muss zuvor geoeffnet worden sein.
	// Parameter: keine
	// Rueckgabe: Zustand der Leitung (1/0)
	WORD cts (void)
	{
		typedef WORD (CALLBACK* LP1INT)();
		LP1INT p; 
		p = (LP1INT)GetProcAddress (hDLL,"CTS");
		return p ();
	};
	
	// RI  
	// Abfragen der seriellen Leitung RI. Diese muss zuvor geoeffnet worden sein.
	// Parameter: keine
	// Rueckgabe: Zustand der Leitung (1/0)
	WORD ri (void)
	{
		typedef WORD (CALLBACK* LP1INT)();
		LP1INT p; 
		p = (LP1INT)GetProcAddress (hDLL,"RI");
		return p ();
	};
	
	// DCD 
	// Abfragen der seriellen Leitung DCD. Diese muss zuvor geoeffnet worden sein.
	// Parameter: keine
	// Rueckgabe: Zustand der Leitung (1/0)
	WORD dcd (void)
	{
		typedef WORD (CALLBACK* LP1INT)();
		LP1INT p; 
		p = (LP1INT)GetProcAddress (hDLL,"DCD");
		return p ();
	};
	
	// OPENCOM 
	// Oeffnen der seriellen Schnittstelle
	// Parameter: Zeichenkette als nullterminierter String
	// Rueckgabe: Bei Fehler 0.
	UINT opencom (char * string)
	{
		typedef UINT (CALLBACK * LP2INT)(char *);
		LP2INT p;
		p = (LP2INT)GetProcAddress (hDLL, "OPENCOM"); 
		return p (string);
	};
	
	// CLOSECOM  
	// Schliessen der seriellen Schnittstelle
	// Parameter: keine
	// Rueckgabe: keine
	BOOL closecom (void)
	{
		typedef int (CALLBACK* LP2INT)();
		LP2INT p;
		p = (LP2INT)GetProcAddress (hDLL, "CLOSECOM"); 
		return p ();
	};
	
	// READBYTE  
	// Lesen eines Bytes von der seriellen Schnittstelle. Diese muss zuvor 
	// geoeffnet worden sein. 
	// Parameter: keine
	// Rueckgabe: -1 bei Fehler, sonst das empfangene Byte
	UINT readbyte (void)
	{
		typedef UINT (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT)GetProcAddress (hDLL, "READBYTE"); 
		return p ();
	};
	
	// SENDBYTE  
	// Senden eines Bytes ueber die serielle Schnittstelle. Diese muss zuvor 
	// geoeffnet worden sein.
	// Parameter: Ein Byte (0..255)
	// Rueckgabe: keine
	int sendbyte (BYTE value)
		//int sendbyte (Word wValue)
	{
		typedef int (CALLBACK* LP2INT)(BYTE);
		//typedef int (CALLBACK* LP2INT)(WORD);
		LP2INT p; // Funktionszeiger
		p = (LP2INT)GetProcAddress (hDLL, "SENDBYTE"); 
		return p (value);
		//return p (wValue);
	};
	
	// TIMEOUT 
	// Setzen des Timeouts der seriellen Schnittstelle. Diese muss zuvor 
	// geoeffnet worden sein. Trifft waehrend dieser Zeit kein Zeichen
	// ein, so wird bei READBYTE abgebrochen und -1 zurueck geliefert.
	// Parameter: Zeit in Millisekunden (1..65535)
	// Rueckgabe: vorige Zeit in Millisekunden
	int timeout (WORD wTime)
	{
		typedef int (CALLBACK* LP2INT)(WORD);
		LP2INT p; // Funktionszeiger
		p = (LP2INT)GetProcAddress (hDLL, "TIMEOUT"); 
		return p (wTime);
	};
	
	/****************** nur für 16Bit-Systeme ********************/
	// INPORT  
	// Lesen eines Ports. 
	// Parameter: Adresse (0..65535)
	// Rueckgabe: Inhalt (Byte) der angegebenen Portadresse
	BYTE inport (WORD wPort)
	{
		typedef BYTE (CALLBACK* LP2INT)(WORD);
		LP2INT p;
		p = (LP2INT) GetProcAddress (hDLL, "INPORT"); 
		return p (wPort);
	};
	/************************************************************/
	
	/****************** nur für 16Bit-Systeme ********************/
	// OUTPORT 
	// Ausgabe an einen Port
	// Parameter: Adresse (0..65535), Daten(0..255)  
	// Rueckgabe: keine.
	int outport (WORD wPort, BYTE value)
	{
		typedef int (CALLBACK* LP2INT)(WORD, BYTE);
		LP2INT p;
		p = (LP2INT) GetProcAddress (hDLL, "OUTPORT"); 
		return p (wPort, value);
	};
	/************************************************************/
	
	// SOUNDIS 
	// Stellt fest, ob eine Soundkarte vorhanden ist
	// Parameter: keine
	// Rueckgabe: 0 oder -1 bzw. True oder False
	int soundis (void)
	{
		typedef int (CALLBACK* LP2INT)();
		LP2INT p;
		p = (LP2INT) GetProcAddress (hDLL, "SOUNDIS");
		return p ();
	};
	
	// SOUNDCAPIN  
	// Die Soundkartenaufnahme-Eigenschaften werden in einer MessageBox 
	// ausgegeben.
	// Parameter: keine
	// Rueckgabe: keine
	int soundcapin (void)
	{
		typedef int (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "SOUNDCAPIN");
		return p ();
	};
	
	// SOUNDCAPOUT 
	// Die Soundkartenwiedergabe-Eigenschaften werden in einer MessageBox 
	// ausgegeben.
	// Parameter: keine
	// Rueckgabe: keine
	int soundcapout (void)
	{
		typedef int (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "SOUNDCAPOUT");
		return p ();
	};
	
	// SOUNDIN
	// Startet eine Soundaufnahme (mono) und legt die Daten in den uebergebenen 
	// Pufferspeicher ab.
	// Parameter: Speicher und Speichergroesse (in Bytes)
	// Rueckgabe: keine
	int soundin (BYTE * pBuffer, DWORD dwLength)
	{
		typedef int (CALLBACK* LP2INT)(BYTE*,DWORD);
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "SOUNDIN");
		return p (pBuffer, dwLength);
	};
	
	// SOUNDOUT  
	// Startet eine Soundwiedergabe (mono) der Daten des uebergebenen Pufferspeichers.
	// Parameter: Speicher und Speichergroesse (in Bytes)
	// Rueckgabe: keine
	int soundout (BYTE * pBuffer, DWORD dwLength)
	{
		typedef int (CALLBACK* LP2INT)(BYTE*,DWORD);
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "SOUNDOUT");
		return p (pBuffer, dwLength);
	};
	
	// SOUNDGETRATE  
	// Erfagt die eingestellte Abtastfrequenz.
	// Parameter: keine
	// Rueckgabe: Abtastfrequenz in Samples/Sekunde, z.B. 11025;
	WORD soundgetrate (void)
	{
		typedef WORD (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "SOUNDGETRATE");
		return p ();
	};
	
	// SOUNDSETRATE
	// Stellt eine Abtastfrequenz ein.
	// Parameter: Abtastfrequenz in Samples/Sekunde
	// Rueckgabe: Vorige Abtastfrequenz in Samples/Sekunde. z.B. 11025;
	DWORD soundsetrate (DWORD dwSampleRate)
	{
		typedef DWORD (CALLBACK* LP2INT)(DWORD);
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "SOUNDSETRATE");
		return p (dwSampleRate);
	};
	
	// SOUNGETBYTES  
	// Bytes pro Sample erfragen
	// Parameter: keine
	// Rueckgabe: 1 oder 2. Ein Byte entspricht 8 Bits/Sample. Zwei Bytes 
	// entsprechen 16 Bit/Sample.
	WORD soundgetbytes (void)
	{
		typedef WORD (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "SOUNDGETBYTES");
		return p ();
	};
	
	// SOUNDSETBYTES
	// Bytes pro Sample einstellen.
	// Parameter: 1 oder 2. Ein Byte entspricht 8 Bits/Sample. Zwei Bytes 
	// entsprechen 16 Bit/Sample.
	// Rueckgabe: vorige Bytes pro Sample.
	DWORD soundsetbytes (DWORD dwBitsPerSample)
	{
		typedef DWORD (CALLBACK* LP2INT)(DWORD);
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "SOUNDSETBYTES");
		return p (dwBitsPerSample);
	};
	
	// SOUNDBUSY
	// Testen, ob die Soundkarte gerade beschaeftigt ist.
	// Parameter: keine
	// Rueckgabe: Zustand der Soundkarte (1/0)
	DWORD soundbusy (void)
	{
		typedef DWORD (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "SOUNDBUSY");
		return p ();
	};
	
	// JOYX  
	// X-Position erfragen.
	// Parameter: keine
	// Rueckgabe: Position als Zahlenwert.
	DWORD joyx (void)
	{
		typedef DWORD (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "JOYX");
		return p ();
	};
	
	// JOYY  
	// Y-Position erfragen.
	// Parameter: keine
	// Rueckgabe: Position als Zahlenwert.
	DWORD joyy (void)
	{
		typedef DWORD (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "JOYY");
		return p ();
	};
	
	// JOYZ  
	// Z-Position erfragen.
	// Parameter: keine
	// Rueckgabe: Position als Zahlenwert.
	DWORD joyz (void)
	{
		typedef DWORD (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "JOYZ");
		return p ();
	};
	
	// JOYR  
	// R-Position erfragen.
	// Parameter: keine
	// Rueckgabe: Position als Zahlenwert.
	DWORD joyr (void)
	{
		typedef DWORD (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "JOYR");
		return p ();
	};
	
	// JOYU  
	// U-Position erfragen.
	// Parameter: keine
	// Rueckgabe: Position als Zahlenwert.
	DWORD joyu (void)
	{
		typedef DWORD (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "JOYU");
		return p ();
	};
	
	// JOYV  
	// V-Position erfragen.
	// Parameter: keine
	// Rueckgabe: Position als Zahlenwert.
	DWORD joyv (void)
	{
		typedef DWORD (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "JOYV");
		return p ();
	};
	
	// JOYBUTTON 
	// Tastenabfrage
	// Parameter: keine
	// Rueckgabe: Taste als Zahlenwert.
	DWORD joybutton (void)
	{
		typedef DWORD (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "JOYBUTTON");
		return p ();
	};
	
	// JOYSTICK  
	// Gesamtabfrage in einem Aufruf
	// Parameter: Sieben Variablen zur Aufnahme der Werte
	// Rueckgabe: keine.
	int joystick (DWORD *joyX, DWORD *joyY, DWORD *joyZ, DWORD *joyR, DWORD *joyU, DWORD *joyV, DWORD *joyButton)
	{
		typedef int (CALLBACK* LP2INT)(DWORD*,DWORD*,DWORD*,DWORD*,DWORD*,DWORD*,DWORD*);
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "JOYSTICK");
		return p (joyX, joyY, joyZ, joyR, joyU, joyV, joyButton);
	};
	
	// DELAY 
	// Verzoegerung im Millisekundenbereich.
	// Parameter: Zeit in Millisekunden
	// Rueckgabe: keine
	int delay (WORD wTime)
	{
		typedef int (CALLBACK* LP2INT)(WORD);
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "DELAY");
		return p (wTime);
	};
	
	// TIMEINIT  
	// Setzt den Millisekunden-Zeitzaehler auf Null.
	// Parameter: keine
	// Rueckgabe: keine
	int timeinit (void)
	{
		typedef int (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "TIMEINIT");
		return p ();
	}
	
	// TIMEREAD  
	// Millisekunden-Timer auslesen. Das Ergebnis ist die Anzahl der 
	// vergangenen Millisekunden nach Aufruf von TIMEINIT.
	// Parameter: keine
	// Rueckgabe: Millisekunden als Zahlenwert
	DWORD timeread (void)
	{
		typedef DWORD (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "TIMEREAD");
		return p ();
	};
	
	// DELAYUS
	// Verzoegerung im Mikrosekundenbereich.
	// Parameter: Zeit in Mikrosekunden
	// Rueckgabe: keine
	int delayus (DWORD dwTime)
	{
		typedef int (CALLBACK* LP2INT)(DWORD);
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "DELAYUS");
		return p (dwTime);
	};
	
	// TIMEINITUS  
	// Setzt den Mikrosekunden-Zeitzaehler auf Null.
	// Parameter: keine
	// Rueckgabe: keine
	int timeinitus (void)
	{
		typedef int (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "TIMEINITUS");
		return p ();
	};
	
	// TIMEREADUS  
	// Mikrosekunden-Timer auslesen. Das Ergebnis ist die Anzahl der 
	// vergangenen Mikrosekunden nach Aufruf von TIMEINITUS.
	// Parameter: keine
	// Rueckgabe: Mikrosekunden als Zahlenwert
	DWORD timereadus (void)
	{
		typedef DWORD (CALLBACK* LP2INT)();
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "TIMEREADUS");
		return p ();
	};
	
	// REALTIME  
	// Hoechste Prioritaet einstellen. Dieser Aufruf ist bei zeitkritischen 
	// Ausgaben nuetzlich. Er sollte nur kurz aktiviert werden, da alle 
	// anderen Programme dann langsamer laufen.
	// Parameter: 0 oder 1
	// Rueckgabe: keine
	int realtime (WORD wPriority)
	{
		typedef int (CALLBACK* LP2INT)(WORD);
		LP2INT p; // Funktionszeiger
		p = (LP2INT) GetProcAddress (hDLL, "REALTIME");
		return p (wPriority);
	};
	
private:
	bool loaddll (char * name)
	{
		char s[256];
		hDLL = LoadLibrary (name);
		
		if (hDLL == NULL)
		{
			wsprintf (s, "%s nicht gefunden.", name);
			MessageBox (GetFocus (), s, "ERROR", MB_OK | MB_ICONSTOP);
			return (false);
		}
		return (true);
	};
	

	HINSTANCE hDLL;
	
};

#endif // CPORTDLLCHEADER
Eine Beispielanwendung in C:
Code:
/*******************************************************************************
** Beispielanwendung für "PORT.DLL" und "RSAPI.DLL"
*******************************************************************************/
#include "port.h"
#include "cport.h"


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
										LPSTR lpCmdLine, int nCmdShow)
{
	int i;
	BOOL b;
	WORD wDsr, wCts, wRi, wDcd, w;
	DWORD d, dX, dY, dZ, dR, dU, dV, dButton;
	char s[256];


	//////////// C-like mit port.h //////////////////////
	if (loaddll (THEDLL))
	{
		// Serielle Schnittstelle(n):
		i = opencom ("COM2:19200,N,8,1");
		wsprintf (s, "OpenCom COM2:19200,N,8,1 liefert: %d", i);
		mes (s);

		i = readbyte (); // Byte an RxD lesen (wenn vorhanden)
		wsprintf (s, "Readbyte liefert: %d", i);
		mes (s);

		sendbyte (0x55); // ein Byte ueber TxD senden

		wDsr = dsr (); // Leitungen abfragen
		wCts = cts ();
		wRi  = ri ();
		wDcd = dcd ();
		wsprintf (s, "DSR: %d\r\nCTS: %d\r\nRI:  %d\r\nDCD: %d", wDsr, wCts, wRi, wDcd);
		mes (s);

		rts (1); // Leitungen setzen
		dtr (1);
		txd (1);

		b = closecom ();
		wsprintf (s, "CloseCom liefert: %d", b);
		mes (s);

		// Soundkarte:
		i = soundis (); 
		wsprintf (s, "SoundIs liefert: %d", i);
		mes (s);

		soundcapin ();
		soundcapout ();

		w = soundgetrate ();
		wsprintf (s, "SoundGetRate liefert: %d", w);
		mes (s);

		w = soundgetbytes ();
		wsprintf (s, "SoundGetBytes liefert: %d", w);
		mes (s);

		d = soundbusy ();
		wsprintf (s, "SoundBusy liefert: %d", d);
		mes (s);

		// Joystick:
		dX = joyx ();
		dY = joyy ();
		dZ = joyz ();
		dR = joyr ();
		dU = joyu ();
		dV = joyv ();
		dButton = joybutton ();
		wsprintf (s, "JoyX: %d\r\nJoyY: %d\r\nJoyZ: %d\r\nJoyR: %d\r\nJoyU: %d\r\nJoyV: %d\r\nJoyButton: %d", 
			dX, dY, dZ, dR, dU, dV, dButton);
		mes (s);
		// oder
		joystick (&dX, &dY, &dZ, &dR, &dU, &dV, &dButton);
		wsprintf (s, "JoyX: %d\r\nJoyY: %d\r\nJoyZ: %d\r\nJoyR: %d\r\nJoyU: %d\r\nJoyV: %d\r\nJoyButton: %d", 
			dX, dY, dZ, dR, dU, dV, dButton);
		mes (s);

		// Timer:
		timeinit (); // Millisekundenzaehler auf 0 setzen
		// irgendwas machen
		d = timeread (); // seit timeinit vergangene Millisekunden lesen
		wsprintf (s, "TimeRead liefert: %d", d);
		mes (s);

		timeinitus (); // Mikrosekundenzaehler auf 0 setzen
		// irgendwas machen
		d = timereadus (); // seit timeinit vergangene Mikrosekunden lesen
		wsprintf (s, "TimeReadUs liefert: %d", d);
		mes (s);

		freedll ();


		//////////// C++ -like mit cport.h //////////////////////
		CPORT cp;

		i = cp.opencom ("COM2:19200,N,8,1");
		wsprintf (s, "OpenCom COM2:19200,N,8,1 liefert: %d", i);
		cp.mes (s);

		i = cp.readbyte (); // Byte an RxD lesen (wenn vorhanden)
		wsprintf (s, "Readbyte liefert: %d", i);
		cp.mes (s);

		cp.sendbyte (0x55); // ein Byte ueber TxD senden

		wDsr = cp.dsr (); // Leitungen abfragen
		wCts = cp.cts ();
		wRi  = cp.ri ();
		wDcd = cp.dcd ();
		wsprintf (s, "DSR: %d\r\nCTS: %d\r\nRI:  %d\r\nDCD: %d", wDsr, wCts, wRi, wDcd);
		cp.mes (s);

		cp.rts (1); // Leitungen setzen
		cp.dtr (1);
		cp.txd (1);

		b = cp.closecom ();
		wsprintf (s, "CloseCom liefert: %d", b);
		cp.mes (s);

		// Soundkarte:
		i = cp.soundis (); 
		wsprintf (s, "SoundIs liefert: %d", i);
		cp.mes (s);

		cp.soundcapin ();
		cp.soundcapout ();

		w = cp.soundgetrate ();
		wsprintf (s, "SoundGetRate liefert: %d", w);
		cp.mes (s);

		w = cp.soundgetbytes ();
		wsprintf (s, "SoundGetBytes liefert: %d", w);
		cp.mes (s);

		d = cp.soundbusy ();
		wsprintf (s, "SoundBusy liefert: %d", d);
		cp.mes (s);

		// Joystick:
		dX = cp.joyx ();
		dY = cp.joyy ();
		dZ = cp.joyz ();
		dR = cp.joyr ();
		dU = cp.joyu ();
		dV = cp.joyv ();
		dButton = cp.joybutton ();
		wsprintf (s, "JoyX: %d\r\nJoyY: %d\r\nJoyZ: %d\r\nJoyR: %d\r\nJoyU: %d\r\nJoyV: %d\r\nJoyButton: %d", 
			dX, dY, dZ, dR, dU, dV, dButton);
		cp.mes (s);
		// oder
		cp.joystick (&dX, &dY, &dZ, &dR, &dU, &dV, &dButton);
		wsprintf (s, "JoyX: %d\r\nJoyY: %d\r\nJoyZ: %d\r\nJoyR: %d\r\nJoyU: %d\r\nJoyV: %d\r\nJoyButton: %d", 
			dX, dY, dZ, dR, dU, dV, dButton);
		cp.mes (s);

		// Timer:
		cp.timeinit (); // Millisekundenzaehler auf 0 setzen
		// irgendwas machen
		d = cp.timeread (); // seit timeinit vergangene Millisekunden lesen
		wsprintf (s, "TimeRead liefert: %d", d);
		cp.mes (s);

		cp.timeinitus (); // Mikrosekundenzaehler auf 0 setzen
		// irgendwas machen
		d = cp.timereadus (); // seit timeinit vergangene Mikrosekunden lesen
		wsprintf (s, "TimeReadUs liefert: %d", d);
		cp.mes (s);

		return 1;
	}

	return 0;
}

Ist nicht getestet. Ich verwende in C/C++ das Windows-API mit CreateFile, WriteFile, ReadFile, ...
Wenn es Dich interessiert, habe ich auch dazu Beispiel-Code (getestet).

Blackbird