#include <GL/glew.h> #include <GL/glut.h> extern "C" void createVBO(int n, GLuint* vbo) { glGenBuffers( n, vbo); }
だめw glewinit() などはうまくいく。glew64.lib を抜くと __imp___glewGenBuffers が見つからないという。関数アドレス自体は返してよこすが、本体ではない?
interface subroutine createVBO(n, nn) BIND(C, name='createVBO') INTEGER, VALUE :: n INTEGER :: nn(n) end integer function glewinit() BIND(C, name='glewInit') end integer function glewIsSupported(c) BIND(c, name='glewIsSupported') CHARACTER(*) :: c end end interface INTEGER(HANDLE) :: dllhInst POINTER (glGenBuffers_PTR, glGenBuffers) dllhInst = LoadLibrary("glew64.dll"C) print *, 'dllhInst ', dllhInst glGenBuffers_PTR = GetProcAddress(dllhInst, "__glewGenBuffers"C) print *, 'glGenBuffers_PTR', glGenBuffers_PTR ! CALL glGenBuffers( 1, nn ) ! access violation ! !エラー 3 error LNK2001: 外部シンボル "__imp___glewGenBuffers" は未解決です。 vbo.lib(vbo.obj)
これもだめ。よく分からんw
dllhInst = LoadLibrary("Opengl32.dll"C) print *, 'dllhInst ', dllhInst wglGetProcAddress_PTR = GetProcAddress(dllhInst, "wglGetProcAddress"C) print *, 'wglGetProcAddress_PTR', wglGetProcAddress_PTR glGenBuffers_PTR = wglGetProcAddress("glGenBuffers"C)
glew.c のソースを見ると、マクロが定義されていて、普通の関数ポインターとは異なる呼び方をしているようです。
WINDGIAPI≡__declspec(dllimport), APIENTRY ≡ __stdcall 等が定義されていました。しかし Fortran 側で !DEC$ オプションで定義してもうまくいきませんでした。とりあえずお手上げw