- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プログラム実行中に強制終了)
プログラム実行中に強制終了
このQ&Aのポイント
- VC++6.0でDLLを使用したVBの図形描画プログラムを実行中に強制終了してしまいます。
- VC++で作成したDLLが原因で、連続して図形を描画すると異常に高いPF使用量が発生し、強制終了に至ってしまいます。
- VBのみで図形を描画する場合にはこの問題は発生しなかったため、VC++で作ったDLLが問題の可能性があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> PF使用量が1.2GB メモリの使用量が異常ですね。良くある原因は、 ・malloc()したのにfree()していない。 ・クラスをnewしたのにdeleteしていない。 ・ファイルのように、「開く」で使用を開始するものに対して「閉じる」をしていない。 ・使用済みスレッドが生き残っている。 等ですが、この辺は確認されましたか?
お礼
ご指摘いただいた点についていろいろと見直したところ、解決できました。有難うございました。
補足
上の2項目に関してはおそらく大丈夫だと思います。 下の2項目についてはどうなのかちょっと不安です。参考のためにDLLのソースを記載しておきます。 VBでの呼び出し順序は、 myglInit → mygl3DInit → DrawSpace → afterDraw → となってます。 #include <windows.h> #include <math.h> #include <gl\gl.h> #include <gl/glu.h> #include <gl/glut.h> #define PI 3.14159265 #define F_GRID 0 HGLRC hRC;//レンダリングコンテキストのハンドル //自作関数prototype void CalcShadowMat(float*,double*,float*); _declspec(dllexport) void _stdcall DrawSpace(float *pp) { glPolygonMode(GL_FRONT,GL_FILL); glPolygonMode(GL_BACK,GL_FILL); glLineWidth(2.0f); glColor3f(0.0f,0.0f,1.0f); glPushMatrix(); static float p[8][3]={{pp[1],pp[2],pp[3]},{pp[4],pp[5],pp[6]}, {pp[7],pp[8],pp[9]},{pp[10],pp[11],pp[12]},{pp[13],pp[14],pp[15]}, {pp[16],pp[17],pp[18]},{pp[19],pp[20],pp[21]},{pp[22],pp[23],pp[24]}}; glTranslatef(0.0f,0.0f,0.0f); glRotatef(0.0f,0.0f,0.0f,1.0f); glScalef(10.0f,10.0f,10.0f); glBegin(GL_QUADS); glVertex3fv(p[0]); glVertex3fv(p[1]); glVertex3fv(p[2]); glVertex3fv(p[3]); glVertex3fv(p[0]); glVertex3fv(p[3]); glVertex3fv(p[7]); glVertex3fv(p[4]); glVertex3fv(p[0]); glVertex3fv(p[4]); glVertex3fv(p[5]); glVertex3fv(p[1]); glVertex3fv(p[1]); glVertex3fv(p[5]); glVertex3fv(p[6]); glVertex3fv(p[2]); glVertex3fv(p[2]); glVertex3fv(p[6]); glVertex3fv(p[7]); glVertex3fv(p[3]); glVertex3fv(p[4]); glVertex3fv(p[7]); glVertex3fv(p[6]); glVertex3fv(p[5]); glEnd(); glBegin(GL_LINES); glVertex3f(5.0f,5.0f,5.0f); glVertex3f(10.0f,5.0f,5.0f); glEnd(); glBegin(GL_POLYGON); glVertex3f(10.0f,5.0f,5.0f); glVertex3f(9.5f,5.5f,5.0f); glVertex3f(10.0f,6.0f,5.0f); glVertex3f(10.5f,5.5f,5.0f); glEnd(); glPopMatrix(); } _declspec(dllexport) void _stdcall afterDraw(HDC hDC) { hRC = wglCreateContext(hDC); SwapBuffers(hDC); //終了のための後処理 wglMakeCurrent(hDC,NULL wglDeleteContext(hRC); } _declspec(dllexport) void _stdcall myglInit(HDC hDC) { //ピクセルフォーマットの初期設定 PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,24,0,0,0,0,0,0,0,0,0,0,0,0,0, 32,0,0,PFD_MAIN_PLANE,0,0,0,0 }; int pixelFormat = ChoosePixelFormat(hDC,&pfd); BOOL success = SetPixelFormat(hDC,pixelFormat,&pfd); hRC = wglCreateContext(hDC); wglMakeCurrent(hDC,hRC); glClearColor(1.0f,1.0f,1.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT); } _declspec(dllexport) void _stdcall mygl3DInit(float* setData) { double aspectRatio,norm,picWidth,picHeight; double view[3] double cnt[3] ; double up[3]; double fov,nearZ,farZ int i; picWidth = (double)setData[0]; picHeight = (double)setData[1]; fov = (double)setData[2]; nearZ = (double)setData[3]; farZ = (double)setData[4]; view[0] = (double)setData[5]; view[1] = (double)setData[6]; view[2] = (double)setData[7 cnt[0] = (double)setData[8]; cnt[1] = (double)setData[9]; cnt[2] = (double)setData[10]; glViewport(0,0,(int)picWidth,(int)picHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity aspectRatio = picWidth/picHeight; gluPerspective(fov,aspectRatio,nearZ,farZ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); up[0] = -(cnt[0]-view[0])*(cnt[2]-view[2]); up[1] = -(cnt[1]-view[1])*(cnt[2]-view[2]); //up[0]=0.0;up[1]=0.0; up[2] = (cnt[0]-view[0])*(cnt[0]-view[0])+(cnt[1]-view[1])*(cnt[1]-view[1]); norm = sqrt(up[0]*up[0]+up[1]*up[1]+up[2]*up[2]); for(i=0; i<3;i++) up[i] /= norm; if(view[2] == cnt[2]) view[2] = cnt[2]+0.1; gluLookAt(view[0],view[1],view[2],cnt[0],cnt[1],cnt[2],up[0],up[1],up[2]); }