アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、VC++6.0でDLLを作成し、それを用いてVBで図形を描画をするプログラムを作っています。
実行中に連続して図形を描画すると強制終了になります。VBのみで図形を書いたりした場合はこのようなことは起こったことがないのでVCで作ったDLLが問題じゃないのかなと予想しています。
強制するときの状況ですが、

"0x69634e8c"の命令が"0x0000003c"のメモリを参照しました。メモリが"written"になることは出来ませんでした。

というメッセージが表示され、次に

"0x5c8faed8"の命令が"0x00000564"のメモリを参照しました。メモリが"read"になることは出来ませんでした。

というメッセージが表示され強制終了されます。
またタスクマネージャで強制終了する際の様子を見ていると、PF使用量が1.2GBと異常に高い値になっていました。

どなたかこの問題に対して意見を下さいませんか?

A 回答 (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]);
}

補足日時:2007/07/30 06:19
    • good
    • 0
この回答へのお礼

ご指摘いただいた点についていろいろと見直したところ、解決できました。有難うございました。

お礼日時:2007/07/30 22:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!