
現在、VC++6.0でDLLを作成し、それを用いてVBで図形を描画をするプログラムを作っています。
実行中に連続して図形を描画すると強制終了になります。VBのみで図形を書いたりした場合はこのようなことは起こったことがないのでVCで作ったDLLが問題じゃないのかなと予想しています。
強制するときの状況ですが、
"0x69634e8c"の命令が"0x0000003c"のメモリを参照しました。メモリが"written"になることは出来ませんでした。
というメッセージが表示され、次に
"0x5c8faed8"の命令が"0x00000564"のメモリを参照しました。メモリが"read"になることは出来ませんでした。
というメッセージが表示され強制終了されます。
またタスクマネージャで強制終了する際の様子を見ていると、PF使用量が1.2GBと異常に高い値になっていました。
どなたかこの問題に対して意見を下さいませんか?

No.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]);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メモリが不足しています(VBA)
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
recvfrom関数の戻り値について
-
エクセル キャッシュメモリー...
-
ExitProcessの関数コールについ...
-
VB2005 Datagridview の仮想モ...
-
C言語:関数のメモリ上でのサイ...
-
EXCEL-VBAにてADOのレコードセ...
-
「ヒープサイズの設定」て何?
-
C言語における再帰呼び出しの...
-
エクセルのメモリ使用状況/Appl...
-
エクセルVBA 大容量CSVファイル...
-
メモリを解放しないとどうなる?
-
メモリ内をトレースログに吐きたい
-
gmtime()で止まってしまいます...
-
1ページに収まるオブジェクト...
-
シェル(perl)が使用するメモリ...
-
ルネサスマイコン(R8C) ビルド...
-
Macターミナルで実行中のプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
Access Violationについて
-
VBAの配列サイズとメモリに関して
-
メモリのセグメント違反の解決...
-
メモリが不足しています(VBA)
-
メモリ不足
-
大容量のメモリ確保をスワップ...
-
ファイルマッピング関数で失敗
-
PC-98で拡張メモリを使え...
-
エラーについて
-
「ヒープサイズの設定」て何?
-
エクセルのメモリ使用状況/Appl...
-
C言語における再帰呼び出しの...
-
オフスクリーンサーフェスへの...
-
1ページに収まるオブジェクト...
-
新規購入PCのスペックについて...
-
4GB搭載したマシンのメモリ情...
-
組み込み系でのmallocについて
-
ルネサスマイコン(R8C) ビルド...
-
Visual Basic Net2003
おすすめ情報