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.

うごいたっぽい。