fortran66のブログ

fortran について書きます。

メモ帳w

#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