DLL für PPJoy
-
Hallo, ich versuche momentan mit dem Programm PPJoy einen virtuellen Joystick auf meinem PC zu installieren, dieser soll seine Daten aus einer selbst erstellten DLL Datei bekommen. Dabei braucht PPJoy die beiden Funktionen
MMRESULT joyGetPosEx(UINT uJoyID,LPJOYINFOEX pji);
und
MMRESULT joyGetDevCapsA(UINT_PTR uJoyID,LPJOYCAPS pjc, UINT cbjc);info dazu: http://msdn.microsoft.com/en-us/library/ms709354(VS.85).aspx
Ich hab diese mal in meiner DLL Datei implementiert (wobei ich irgendwelche Werte zum Testen übergebe) und ich kann diese auch in PPJoy einbinden. Mein Problem ist nur, dass sofort nach dem Einbinden eine Fehlermeldung kommt. Daraufhin bringt mir Visual C++ die Option den Debugger zu verwenden, welcher mir eine Zugriffsverletzung beim Lesen Fehlermeldung ausgibt.
Das wichtigste bei den obigen Funktionen ist die Übergabe der Pointer pji und pjc, dort werden Pointer auf structs übergeben in denen ich mit den Funktionen die gewünschen Daten für den Joystick reinschreiben muss.
Ich selbst bin mehr der Java Programmierer und hab nicht so viel Erfahrung in c++ drum wärs ganz gut, wenn mal jemand nen Blick auf meinem Code werfen würde, vieleicht ist ja irgendein offensichtlicher Fehler dabei der mir nicht auffällt.
// MyJoyDLL.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung. // #include "stdafx.h" #ifdef _MANAGED #pragma managed(push, off) #endif typedef struct { WORD wMid; WORD wPid; TCHAR szPname[1]; UINT wXmin; UINT wXmax; UINT wYmin; UINT wYmax; UINT wZmin; UINT wZmax; UINT wNumButtons; UINT wPeriodMin; UINT wPeriodMax; UINT wRmin; UINT wRmax; UINT wUmin; UINT wUmax; UINT wVmin; UINT wVmax; UINT wCaps; UINT wMaxAxes; UINT wNumAxes; UINT wMaxButtons; TCHAR szRegKey[1]; TCHAR szOEMVxD[1]; } JOYCAPS; typedef struct joyinfoex_tag { DWORD dwSize; DWORD dwFlags; DWORD dwXpos; DWORD dwYpos; DWORD dwZpos; DWORD dwRpos; DWORD dwUpos; DWORD dwVpos; DWORD dwButtons; DWORD dwButtonNumber; DWORD dwPOV; DWORD dwReserved1; DWORD dwReserved2; } JOYINFOEX; enum MMRESULT {JOYERR_NOERROR =0}; extern "C" __declspec(dllexport)MMRESULT joyGetPosEx(UINT uJoyID,JOYINFOEX *pji); extern "C" __declspec(dllexport)MMRESULT joyGetDevCapsA(UINT_PTR uJoyID,JOYCAPS *pjc,UINT cbjc); BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } JOYINFOEX joyI; JOYCAPS joyC; // Funktionen implementieren: MMRESULT joyGetPosEx(UINT uJoyID,JOYINFOEX *pji){ joyI.dwSize = 13*4; joyI.dwFlags = 255; //return all joyI.dwXpos = 75; joyI.dwYpos = 75; joyI.dwZpos = 75; joyI.dwRpos = 75; joyI.dwUpos = 75; joyI.dwVpos = 75; joyI.dwButtons = 10; //button 2 und 4 joyI.dwButtonNumber = 2; joyI.dwPOV = 0; //keine Ahnung pji = &joyI; MMRESULT mmresult = JOYERR_NOERROR; return mmresult; } MMRESULT joyGetDevCapsA(UINT_PTR uJoyID,JOYCAPS *pjc,UINT cbjc){ joyC.wMid = 40; joyC.wPid = 0; joyC.szPname[0] = '\0'; joyC.wXmin = 0; joyC.wXmax = 100; joyC.wYmin = 0; joyC.wYmax = 100; joyC.wZmin = 0; joyC.wZmax = 100; joyC.wNumButtons = 6; joyC.wPeriodMin = 0; joyC.wPeriodMax = 0; joyC.wRmin = 0; joyC.wRmax = 100; joyC.wUmin = 0; joyC.wUmax = 100; joyC.wVmin = 0; joyC.wVmax = 100; joyC.wCaps = 15; joyC.wMaxAxes = 6; joyC.wNumAxes = 6; joyC.wMaxButtons = 6; joyC.szRegKey[0] = '\0'; joyC.szOEMVxD[0] = '\0'; pjc = &joyC; MMRESULT mmresult = JOYERR_NOERROR; return mmresult; } #ifdef _MANAGED #pragma managed(pop) #endifIch bedanke mich schonmal für die Antworten.
mfg
Andi
-
Probier mal die Funktionen als __stdcall zu exportieren, also
extern "C" __declspec(dllexport) __stdcall bla
-
Danke für die schnelle Antwort,
also __stdcall konnte ich nur so verwenden: (anders hatte der compiler probleme)extern "C" __declspec(dllexport) MMRESULT __stdcall joyGetPosEx(UINT uJoyID,JOYINFOEX *pji);
extern "C" __declspec(dllexport) MMRESULT __stdcall joyGetDevCapsA(UINT_PTR uJoyID,JOYCAPS *pjc,UINT cbjc);
Bei den Funktionsdeklarationen musste ich die gleiche Änderung vornehmen.
Jetzt mekert aber wieder PPJoy und bringt den Fehler:
Error 127 getting joyGetPosEx() entry
Er erkennt halt die Funktion nicht mehr.