現在、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で質問しましょう!
似たような質問が見つかりました
- Outlook(アウトルック) outlook メモリ不足 1 2022/05/31 10:16
- YouTube Youtubeの使い方 1 2023/06/13 07:56
- システム CPUの問題について 2 2022/07/09 12:04
- その他(パソコン・スマホ・電化製品) FMVWD1A23Bのノートパソコンで、フィモ-ラ12を使って動画編集をしてるのかだけれどフィモ-ラ 3 2023/05/10 16:47
- Mac OS MacのFinderでmovファイルのサムネイルが表示されないのと、クイックルックが出来ません。 こ 3 2023/07/24 18:40
- オンラインゲーム PCのオンラインゲームが急に重くなった 4 2022/10/11 05:15
- iPhone(アイフォーン) 容量は半分以上あるのにアプリが強制終了する理由はなんですか? CPUがどのような状態なのでしょうか? 8 2023/08/27 00:50
- デスクトップパソコン windows7を使っているパソコンでの質問です。先日動作が遅く再起動かけると「windowsを起動 9 2022/06/16 21:31
- Firefox(ファイヤーフォックス) firefoxが頻繁に停止する 1 2023/01/09 10:26
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C言語】再帰が時間がかかる...
-
VBAの配列サイズとメモリに関して
-
動的メモリとexit(C言語)
-
メモリアロケーション異常の発...
-
C言語で、メモリを解放しないで...
-
エクセル キャッシュメモリー...
-
プログラムの最大メモリ消費量...
-
Macターミナルで実行中のプログ...
-
MACで動く実行ファイルをWindow...
-
緯度、経度の 10進法と 60進法...
-
タスクマネージャーのプロセス...
-
Webプログラムってネイティブア...
-
Excelでのセル内容の高速消去方法
-
起動中の他のプログラム(orプ...
-
コマンドライン版ソフトの意義
-
プログラムの再起動
-
Do~Loopステートメント
-
家電製品の電力周波数を変える機械
-
初期化は、main関数の外で...
-
プログラミング ソースコード
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
「ヒープサイズの設定」て何?
-
C言語における再帰呼び出しの...
-
エクセルVBA 大容量CSVファイル...
-
動的メモリとexit(C言語)
-
エクセルのメモリ使用状況/Appl...
-
メモリが不足しています(VBA)
-
ファイルマッピング関数で失敗
-
大容量のメモリ確保をスワップ...
-
メモリのセグメント違反の解決...
-
EXCEL-VBAにてADOのレコードセ...
-
メモリ不足
-
エクセル キャッシュメモリー...
-
【C言語】再帰が時間がかかる...
-
C#のOutOfMemoryException発生...
-
closeとメモリの開放について
-
バッチファイルでの実行EXEのメ...
-
メモリの解放について VB6 VBA
-
「memcpy」と「strcpy」について
おすすめ情報