VJoy(仮想ジョイパッド)のAPIテスト
XPで動くバージョンでAPIのテスト(v1.2)
Headsoft - VJoy Virtual Joystick Driver - Home
ちなみに最新版はこちら
vJoy download | SourceForge.net
SDKを使用すると、付属のDLLを使用してジョイパッドの入力を生成することが可能。
ただ、implicit(暗黙的)なDLL読み込みがうまくいかなかった。
念のためstatic libraryの生成も行う。VJoy.cpp, Vjoy32.dll, VJoy.h, StdAfx.hを同一ディレクトリに配置し以下を実行。
ちなみにdlltoolはmingwデフォルトインストールで導入済み、pexportはもともと標準だったものがオプションになったらしく、以下から入手。
https://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/pexports-0.47/pexports-0.47-mingw32-bin.tar.xz/download
tar.xzは7zipで解凍可能。
> pexport VJoy32.dll > VJoy32.def > dlltool --dllname VJoy32.dll --input-def VJoy32.def --output-lib VJoy32.lib > gcc VJoy.cpp VJoy32.dll VJoy.cpp: In function 'int main(int, char**)': VJoy.cpp:15:24: warning: ISO C++ forbids converting a string constant to 'PCHAR' {aka 'char*'} [-Wwrite-strings] VJoy_Initialize("", ""); ^ VJoy.cpp:15:24: warning: ISO C++ forbids converting a string constant to 'PCHAR' {aka 'char*'} [-Wwrite-strings] Temp\ccE9Yzks.o:VJoy.cpp:(.text+0x26): undefined reference to `_imp__VJoy_Initialize@8' Temp\ccE9Yzks.o:VJoy.cpp:(.text+0x6d): undefined reference to `_imp__VJoy_UpdateJoyState@8' Temp\ccE9Yzks.o:VJoy.cpp:(.text+0x77): undefined reference to `_imp__VJoy_Shutdown@0' collect2.exe: error: ld returned 1 exit status
以下で試している明示的リンクではうまくいっているため、DLLファイルそのものには問題はなし。
→namespaceやらなにやらの問題?
ということで、添付のVJoy.cppを明示的リンクに書き換えてテスト。
//main.c #include <stdio.h> #include <windows.h> #include "VJoy.h" int main() { HINSTANCE hinst; JOYSTICK_STATE joyState[2] = {0}; int (*fp_VJoy_Initialize)(char*, char*); int (*fp_VJoy_UpdateJoyState)(int, JOYSTICK_STATE*); int (*fp_VJoy_Shutdown)(); int c; printf("started.\n"); if ((hinst = LoadLibrary("VJoy32.dll")) == NULL) { printf("Error LoadLibrary\n"); } fp_VJoy_Initialize = (int (*)(char*, char*))GetProcAddress(hinst, "VJoy_Initialize"); fp_VJoy_UpdateJoyState = (int (*)(int, JOYSTICK_STATE*))GetProcAddress(hinst, "VJoy_UpdateJoyState"); fp_VJoy_Shutdown = (int (*)())GetProcAddress(hinst, "VJoy_Shutdown"); printf("call VJoy_Initialize.\n"); c = fp_VJoy_Initialize("", ""); joyState[0].XAxis = 32767; joyState[0].YAxis = 32767; joyState[0].ZAxis = 32767; joyState[0].Buttons = 0xAAAAAAAA; joyState[0].POV = (4 << 12) | (4 << 8) | (4 << 4) | 4; c = fp_VJoy_UpdateJoyState(0, &joyState[0]); fp_VJoy_Shutdown(); FreeLibrary(hinst); return 0; }
> gcc VJoy.cpp -o VJoy.exe > VJoy.exe started. call VJoy_Initialize.
うごいたっぽい。