source: dev/BasicCompiler64/varlist.cpp@ 69

Last change on this file since 69 was 69, checked in by dai_9181, 17 years ago

一時文字列をNewしたときに、bUseHeapフラグを立たせないようにした(bUseHeapが立つのは一時構造体のときのみ)。
DEF_PTR_CHARを廃止し、typeOfPtrCharを導入。

File size: 38.5 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2
3//デバッグ用
4#include "../BasicCompiler_Common/debug.h"
5
6//変数リストのツリーハンドル
7HWND hVarTree_Global,hVarTree_Local,hVarTree_This;
8
9int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,int type,int *SubScripts,LONG_PTR lpIndex);
10void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,CClass *pobj_c,BOOL bPtr);
11void VarList_Insert(HWND hVarTree,TV_INSERTSTRUCT *lptv,char *VarName,int type,LONG_PTR offset,LONG_PTR lpIndex){
12 extern HANDLE hDebugProcess;
13 int i2;
14 char temporary[255],temp2[255];
15 LONG_PTR pData;
16 SIZE_T stAccBytes;
17 double dbl;
18 float flt;
19 WORD wData;
20 BYTE byteData;
21 HTREEITEM hParent;
22 _int64 i64data;
23
24 if(type==DEF_OBJECT||type==DEF_STRUCT){
25 if( type==DEF_OBJECT ){
26 // 参照型ということを考慮する
27 ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes);
28 offset = pData;
29 }
30
31 sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,(DWORD64)offset);
32 lptv->item.iImage=1;
33 lptv->item.iSelectedImage=1;
34 hParent=TreeView_InsertItem(hVarTree,lptv);
35
36 VarList_Member(hVarTree,hParent,offset,(CClass *)lpIndex,0);
37 return;
38 }
39 if(type==DEF_PTR_OBJECT||type==DEF_PTR_STRUCT){
40 i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes);
41
42 sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_POINTEROFOBJECT,(DWORD64)pData);
43 lptv->item.iImage=4;
44 lptv->item.iSelectedImage=4;
45 hParent=TreeView_InsertItem(hVarTree,lptv);
46
47 if(i2) VarList_Member(hVarTree,hParent,pData,(CClass *)lpIndex,1);
48 return;
49 }
50 else{
51 if(type==MAKE_PTR_TYPE(DEF_SBYTE,1)||type==MAKE_PTR_TYPE(DEF_BYTE,1)){
52 if(ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes)){
53 for(i2=0;;i2++){
54 if(!ReadProcessMemory(hDebugProcess,(void *)(pData+i2),&temporary[i2],1,&stAccBytes)){
55 i2=-1;
56 break;
57 }
58 if(temporary[i2]=='\0') break;
59 if(i2==64){
60 lstrcpy(temporary+i2,"...");
61 break;
62 }
63 }
64 if(i2==-1) sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(DWORD64)pData,(DWORD64)pData);
65 else sprintf(lptv->item.pszText,"%s %d(&H%X) \"%s\"",VarName,(DWORD64)pData,(DWORD64)pData,temporary);
66 }
67 else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
68 }
69 else if(type==DEF_DOUBLE){
70 if(ReadProcessMemory(hDebugProcess,(void *)offset,&dbl,sizeof(double),&stAccBytes)){
71 sprintf(lptv->item.pszText,"%s %.15g",VarName,dbl);
72 }
73 else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
74 }
75 else if(type==DEF_SINGLE){
76 if(ReadProcessMemory(hDebugProcess,(void *)offset,&flt,sizeof(float),&stAccBytes)){
77 sprintf(lptv->item.pszText,"%s %.6g",VarName,flt);
78 }
79 else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
80 }
81 else if(type==DEF_INT64){
82 _int64 i64data;
83 if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
84 _i64toa(i64data,temporary,10);
85 _i64toa(i64data,temp2,16);
86 CharUpper(temp2);
87 sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
88 }
89 else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
90 }
91 else if(type==DEF_QWORD||IsPtrType(type)){
92 if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
93 _ui64toa(i64data,temporary,10);
94 _ui64toa(i64data,temp2,16);
95 CharUpper(temp2);
96 sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
97 }
98 else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
99 }
100 else if(type==DEF_LONG){
101 if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
102 sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,i64data,i64data);
103 }
104 else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
105 }
106 else if(type==DEF_DWORD){
107 if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
108 sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,i64data,i64data);
109 }
110 else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
111 }
112 else if(type==DEF_INTEGER || (isUnicode&&type==DEF_CHAR)){
113 if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&stAccBytes)){
114 sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(short)wData,(short)wData);
115 }
116 else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
117 }
118 else if(type==DEF_WORD){
119 if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&stAccBytes)){
120 sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,wData,wData);
121 }
122 else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
123 }
124 else if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){
125 if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&stAccBytes)){
126 temporary[0]=byteData;
127 temporary[1]=0;
128 sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,(char)byteData,byteData,temporary);
129 }
130 else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
131 }
132 else if(type==DEF_BYTE){
133 if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&stAccBytes)){
134 temporary[0]=byteData;
135 temporary[1]=0;
136 sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,byteData,byteData,temporary);
137 }
138 else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
139 }
140 else if(type==DEF_BOOLEAN){
141 if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&stAccBytes)){
142 if( byteData ) lstrcpy( temporary, "True" );
143 else lstrcpy( temporary, "False" );
144
145 wsprintf(lptv->item.pszText,"%s %s",VarName,temporary);
146 }
147 else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
148 }
149 lptv->item.iImage=2;
150 lptv->item.iSelectedImage=2;
151 }
152 TreeView_InsertItem(hVarTree,lptv);
153}
154void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,CClass *pobj_c,BOOL bPtr){
155 int i,i2;
156 char VarData[VN_SIZE],VarName[VN_SIZE];
157 TV_INSERTSTRUCT tv;
158
159 memset(&tv,0,sizeof(TV_INSERTSTRUCT));
160 tv.hInsertAfter=TVI_LAST;
161 tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
162 tv.hParent=hParent;
163 tv.item.pszText=VarData;
164
165 for(i=0;i<pobj_c->iMemberNum;i++){
166 if(bPtr){
167 lstrcpy(VarName,"->");
168 lstrcat(VarName,pobj_c->ppobj_Member[i]->name);
169 }
170 else{
171 lstrcpy(VarName,".");
172 lstrcat(VarName,pobj_c->ppobj_Member[i]->name);
173 }
174
175 LONG_PTR offset;
176 offset=pobj_c->GetMemberOffset( pobj_c->ppobj_Member[i]->name, &i2 );
177
178 if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
179 //構造体内の配列
180 sprintf(VarData,"%s %s(&H%X)",VarName,STRING_ARRAY,pTopOffset+offset);
181 tv.item.iImage=0;
182 tv.item.iSelectedImage=0;
183 hParent=TreeView_InsertItem(hVarTree,&tv);
184
185 i2=VarList_Array(hVarTree,hParent,
186 pTopOffset+offset,
187 pobj_c->ppobj_Member[i]->TypeInfo.type,
188 pobj_c->ppobj_Member[i]->SubScripts,
189 pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
190 }
191 else{
192 //メンバ変数
193 VarList_Insert(hVarTree,
194 &tv,
195 VarName,
196 pobj_c->ppobj_Member[i]->TypeInfo.type,
197 pTopOffset+offset,
198 pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
199 }
200 }
201}
202int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,int type,int *SubScripts,LONG_PTR lpIndex){
203 int i,i2,i3,ElementNum,MemCounter,UseCount[255],TypeSize;
204 char temporary[VN_SIZE],temp2[DIGIT_SIZE];
205
206 TV_INSERTSTRUCT tv;
207 memset(&tv,0,sizeof(TV_INSERTSTRUCT));
208 tv.hInsertAfter=TVI_LAST;
209 tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
210 tv.hParent=hParent;
211 tv.item.pszText=temporary;
212
213 TypeSize=GetTypeSize(type,lpIndex);
214
215 for(i=0;i<255;i++){
216 if(SubScripts[i]==-1) break;
217 UseCount[i]=0;
218 }
219 UseCount[i]=-2;
220 MemCounter=0;
221 while(1){
222 UseCount[i]++;
223 for(ElementNum=0;SubScripts[i-ElementNum]<UseCount[i-ElementNum];ElementNum++){
224 UseCount[i-ElementNum]=0;
225 if(i-ElementNum-1<0) return MemCounter;
226 UseCount[i-ElementNum-1]++;
227 }
228
229 if(MemCounter<50){
230 temporary[0]='[';
231 temporary[1]=0;
232 for(i2=0;i2<i;i2++){
233 sprintf(temp2,"%d",UseCount[i2]);
234 lstrcat(temporary,temp2);
235 lstrcat(temporary,",");
236 }
237 i3=lstrlen(temporary);
238 temporary[i3-1]=']';
239 temporary[i3]=0;
240
241 VarList_Insert(hVarTree,&tv,temporary,type,
242 offset+MemCounter*TypeSize,
243 lpIndex);
244 }
245
246 MemCounter++;
247 if(MemCounter==50){
248 lstrcpy(tv.item.pszText,"...");
249 TreeView_InsertItem(hVarTree,&tv);
250 }
251 }
252 return 0;
253}
254void RefreshGlobalVar(void){
255 extern DWORD ImageBase;
256 int i;
257 char temporary[VN_SIZE];
258 TV_INSERTSTRUCT tv;
259 HTREEITEM hParent;
260
261 TreeView_DeleteAllItems(hVarTree_Global);
262
263 memset(&tv,0,sizeof(TV_INSERTSTRUCT));
264 tv.hInsertAfter=TVI_LAST;
265 tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
266 tv.hParent=TVI_ROOT;
267 tv.item.pszText=temporary;
268
269 extern HANDLE hDebugProcess;
270 extern int MemPos_RWSection;
271 extern int MaxGlobalVarNum;
272 extern VARIABLE *GlobalVar;
273
274 for(i=0;i<MaxGlobalVarNum;i++){
275 VARIABLE *pVar=&GlobalVar[i];
276
277 //スコープ外の場合は無視
278 if(pVar->ScopeLevel!=0){
279 if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[0] &&
280 pobj_dti->lplpObp[0] < rva_to_real(pVar->ScopeEndAddress)){
281 //範囲内
282 }
283 else{
284 //範囲外
285 continue;
286 }
287 }
288
289
290 if(!pobj_nv->bShow_DefaultSystem_Var){
291 if(memcmp(pVar->name,"_System_",8)==0||
292 memcmp(pVar->name,"_DebugSys_",10)==0||
293 memcmp(pVar->name,"_PromptSys_",11)==0) continue;
294 }
295 if(!pobj_nv->bShow_Rad_Var){
296 if(memcmp(pVar->name,"_RadSys_",8)==0) continue;
297 }
298 if(!pobj_nv->bShow_GUID_Var){
299 if(memcmp(pVar->name,"GUID_",5)==0||
300 memcmp(pVar->name,"IID_",4)==0||
301 memcmp(pVar->name,"CLSID_",6)==0) continue;
302 }
303
304 //静的メンバ
305 if(strstr(pVar->name,".")) continue;
306
307 if(pVar->bArray){
308 sprintf(temporary,"%s %s(&H%X)",
309 pVar->name,
310 STRING_ARRAY,
311 ImageBase+MemPos_RWSection+pVar->offset);
312 tv.item.iImage=0;
313 tv.item.iSelectedImage=0;
314 hParent=TreeView_InsertItem(hVarTree_Global,&tv);
315
316 VarList_Array(hVarTree_Global,hParent,
317 (LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset),
318 pVar->type,
319 pVar->SubScripts,
320 pVar->u.index);
321 }
322 else{
323 VarList_Insert(hVarTree_Global,
324 &tv,
325 pVar->name,
326 pVar->type,
327 (LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset),
328 pVar->u.index);
329 }
330 }
331}
332void RefreshLocalVar(void){
333 int i,i2,i3,sw;
334 char temporary[VN_SIZE];
335 TV_INSERTSTRUCT tv;
336 HTREEITEM hParent;
337 LONG_PTR offset;
338 SIZE_T stAccBytes;
339 LONG_PTR lpData;
340
341 TreeView_DeleteAllItems(hVarTree_Local);
342
343 memset(&tv,0,sizeof(TV_INSERTSTRUCT));
344 tv.hInsertAfter=TVI_LAST;
345 tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
346 tv.hParent=TVI_ROOT;
347 tv.item.pszText=temporary;
348
349 extern HANDLE hDebugProcess;
350 extern HWND hDebugWnd;
351 i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
352 i2=pobj_dti->iProcLevel-i2;
353
354 if(pobj_dti->lplpSpBase[i2]==0) return;
355
356 extern SUBINFO **ppSubHash;
357 SUBINFO *psi;
358 for(i3=0,sw=0;i3<MAX_HASH;i3++){
359 psi=ppSubHash[i3];
360 while(psi){
361 if(rva_to_real(psi->CompileAddress) <= pobj_dti->lplpObp[i2] &&
362 pobj_dti->lplpObp[i2] < rva_to_real(psi->EndOpAddr)){
363 sw=1;
364 break;
365 }
366
367 psi=psi->pNextData;
368 }
369 if(sw) break;
370 }
371 if(!psi) return;
372
373 for(i=0;i<psi->VarNum;i++){
374 VARIABLE *pVar=&psi->pVar[i];
375
376 //スコープ外の場合は無視
377 if(pVar->ScopeLevel!=0){
378 if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[i2] &&
379 pobj_dti->lplpObp[i2] < rva_to_real(pVar->ScopeEndAddress)){
380 //範囲内
381 }
382 else{
383 //範囲外
384 continue;
385 }
386 }
387
388 if(pVar->bArray){
389 sprintf(temporary,"%s %s(&H%X)",
390 pVar->name,
391 STRING_ARRAY,
392 pobj_dti->lplpSpBase[i2]+pVar->offset);
393 tv.item.iImage=0;
394 tv.item.iSelectedImage=0;
395 hParent=TreeView_InsertItem(hVarTree_Local,&tv);
396
397 VarList_Array(hVarTree_Local,hParent,
398 pobj_dti->lplpSpBase[i2]+pVar->offset,
399 pVar->type,
400 pVar->SubScripts,
401 pVar->u.index);
402 }
403 else{
404 offset=pobj_dti->lplpSpBase[i2]+pVar->offset;
405 if(pVar->fRef){
406 ReadProcessMemory(hDebugProcess,(void *)offset,&lpData,sizeof(LONG_PTR),&stAccBytes);
407 offset=lpData;
408 }
409 VarList_Insert(hVarTree_Local,&tv,
410 pVar->name,
411 pVar->type,
412 offset,
413 pVar->u.index);
414 }
415 }
416
417
418
419 /////////////////////////////
420 // Thisオブジェクトのリスト
421 /////////////////////////////
422
423 TreeView_DeleteAllItems(hVarTree_This);
424 if(!psi->pobj_ParentClass) return;
425
426 //Thisポインタを取得
427 LONG_PTR pThis;
428 for(i=0;i<psi->VarNum;i++){
429 if(lstrcmp(psi->pVar[i].name,"_System_LocalThis")==0) break;
430 }
431 if(i==psi->VarNum) return;
432 lpData=pobj_dti->lplpSpBase[i2]+psi->pVar[i].offset;
433 ReadProcessMemory(hDebugProcess,(void *)lpData,&pThis,sizeof(LONG_PTR),&stAccBytes);
434
435 for(i=0;i<psi->pobj_ParentClass->iMemberNum;i++){
436 offset=psi->pobj_ParentClass->GetMemberOffset( psi->pobj_ParentClass->ppobj_Member[i]->name,&i2);
437
438 if(psi->pobj_ParentClass->ppobj_Member[i]->SubScripts[0]!=-1){
439 //配列
440 sprintf(temporary,"%s %s(&H%X)",
441 psi->pobj_ParentClass->ppobj_Member[i]->name,
442 STRING_ARRAY,
443 (DWORD64)offset);
444 tv.item.iImage=0;
445 tv.item.iSelectedImage=0;
446 hParent=TreeView_InsertItem(hVarTree_This,&tv);
447
448 VarList_Array(hVarTree_This,hParent,
449 pThis+offset,
450 psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.type,
451 psi->pobj_ParentClass->ppobj_Member[i]->SubScripts,
452 psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.u.lpIndex);
453 }
454 else{
455 VarList_Insert(hVarTree_This,&tv,
456 psi->pobj_ParentClass->ppobj_Member[i]->name,
457 psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.type,
458 pThis+offset,
459 psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.u.lpIndex);
460 }
461 }
462}
463void RefreshGlobalVar_with_WindowLock(void){
464 extern HWND hDebugWnd;
465
466 //処理時間を短くするため、一時的に非表示にする
467 LockWindowUpdate(hDebugWnd);
468 ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
469
470 //リフレッシュ
471 RefreshGlobalVar();
472
473 LockWindowUpdate(NULL);
474 ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
475}
476void RefreshLocalVar_with_WindowLock(void){
477 extern HWND hDebugWnd;
478
479 //処理時間を短くするため、一時的に非表示にする
480 LockWindowUpdate(hDebugWnd);
481 ShowWindow(GetParent(hVarTree_Local),SW_HIDE);
482
483 //リフレッシュ
484 RefreshLocalVar();
485
486 LockWindowUpdate(NULL);
487 ShowWindow(GetParent(hVarTree_Local),SW_SHOW);
488}
489
490void SetCalcToWatchList(HWND hListView,int iItem,char *buffer){
491 int i;
492 char temporary[255],temp2[255];
493
494 //エスケープシーケンスをセット
495 SetEscapeSequenceFormat(buffer);
496
497 KillStringSpaces(buffer);
498
499 //カッコを相互チェック
500 if(!CheckParenthesis2(buffer)){
501 ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
502 return;
503 }
504
505 double dbl;
506 _int64 i64data;
507 i=StaticCalculation(true, buffer,0,&i64data,0,1);
508 if(IsRealNumberType(i)){
509 memcpy(&dbl,&i64data,sizeof(double));
510 }
511
512 if(i==0){
513 ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
514 }
515 else if(i==-1){
516 ListView_SetItemText(hListView,iItem,1,"アクセスできません");
517 }
518 else{
519 if(IsRealNumberType(i))
520 sprintf(temporary,"%.15g (&H%08X)",dbl,(int)dbl);
521 else if(Is64Type(i)){
522 _i64toa(i64data,temporary,10);
523 _i64toa(i64data,temp2,16);
524 CharUpper(temp2);
525 sprintf(temporary+lstrlen(temporary)," (&H%s)",temp2);
526 }
527 else sprintf(temporary,"%d (&H%08X)",(long)i64data,(long)i64data);
528
529 ListView_SetItemText(hListView,iItem,1,temporary);
530 }
531}
532void RefreshWatchList(void){
533 extern HWND hDebugWnd;
534 HWND hListView;
535 int i,i2;
536 char temporary[VN_SIZE];
537
538 hListView=GetDlgItem(hDebugWnd,IDC_WATCHLIST);
539 i2=ListView_GetItemCount(hListView);
540 for(i=0;i<i2-1;i++){
541 ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
542
543 //演算結果を表示
544 SetCalcToWatchList(hListView,i,temporary);
545 }
546}
547
548BOOL SetDebugProcCombo(HWND hProcCombo){
549 int i2,i3;
550 char temporary[255];
551
552 extern DWORD ImageBase;
553 extern int MemPos_CodeSection;
554
555 //行番号情報
556 extern int MaxLineInfoNum;
557 extern LINEINFO *pLineInfo;
558 for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
559 for(i2=0;i2<MaxLineInfoNum-1;i2++){
560 if((DWORD64)(pLineInfo[i2].TopObp+ImageBase+MemPos_CodeSection)<=pobj_dti->lplpObp[i3]&&
561 pobj_dti->lplpObp[i3]<=(DWORD64)(pLineInfo[i2+1].TopObp+ImageBase+MemPos_CodeSection)) break;
562 }
563 if(i2==MaxLineInfoNum) pobj_dti->lpdwCp[i3]=-1;
564 else pobj_dti->lpdwCp[i3]=pLineInfo[i2].TopCp;
565 }
566 for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
567 if(pobj_dti->lpdwCp[i3]==-1){
568 pobj_dti->iProcLevel--;
569 for(i2=i3;i2<(int)pobj_dti->iProcLevel+1;i2++){
570 pobj_dti->lplpObp[i2]=pobj_dti->lplpObp[i2+1];
571 pobj_dti->lplpSpBase[i2]=pobj_dti->lplpSpBase[i2+1];
572 pobj_dti->lpdwCp[i2]=pobj_dti->lpdwCp[i2+1];
573 }
574 i3--;
575 continue;
576 }
577 }
578
579 if(!GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel],&i2,temporary)){
580 extern HWND hMainDlg;
581 //"デバッグ情報の取得に失敗"
582 MessageBox(hMainDlg,STRING_DEBUG_FAILED,"ActiveBasic error",MB_OK);
583 return 0;
584 }
585 ShowErrorLine(i2,temporary);
586
587 //プロシージャ コンボボックス
588 extern SUBINFO **ppSubHash;
589 SUBINFO *psi;
590 int sw;
591 SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
592 for(i2=pobj_dti->iProcLevel;i2>=0;i2--){
593 for(i3=0,sw=0;i3<MAX_HASH;i3++){
594 psi=ppSubHash[i3];
595 while(psi){
596 if(rva_to_real(psi->CompileAddress) <= pobj_dti->lplpObp[i2] &&
597 pobj_dti->lplpObp[i2] < rva_to_real(psi->EndOpAddr)){
598 lstrcpy(temporary,psi->name);
599 sw=1;
600 break;
601 }
602 psi=psi->pNextData;
603 }
604 if(sw) break;
605 }
606 if(!psi){
607 if(i2==0){
608 lstrcpy(temporary,"Global");
609 pobj_dti->lplpSpBase[i2]=0;
610 }
611 else lstrcpy(temporary,"error");
612 }
613 SendMessage(hProcCombo,CB_ADDSTRING,0,(LPARAM)temporary);
614 }
615 SendMessage(hProcCombo,CB_SETCURSEL,0,0);
616
617 return pobj_dti->iProcLevel;
618}
619
620//IDC_THREADCOMBOプロシージャ
621LRESULT CALLBACK ThreadComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
622 extern WNDPROC OldThreadComboProc;
623 int i2;
624 DWORD dwThreadID;
625 char temporary[255];
626
627 switch(message){
628 case WM_COMMAND:
629 if(HIWORD(wParam)==CBN_SELCHANGE){
630 SendMessage(hwnd,CB_GETLBTEXT,SendMessage(hwnd,CB_GETCURSEL,0,0),(LPARAM)temporary);
631 sscanf(temporary+2,"%X",&dwThreadID);
632
633 extern DWORD _DebugSys_dwThreadID[256];
634 i2=0;
635 while(_DebugSys_dwThreadID[i2]!=dwThreadID) i2++;
636
637 //次回のステップ実行対象を指定
638 extern int NextStepThreadNum;
639 NextStepThreadNum=i2;
640
641 //スレッド情報をリフレッシュ
642 pobj_dti->Reflesh(i2);
643
644 SetDebugProcCombo(GetDlgItem(GetParent(hwnd),IDC_PROCCOMBO));
645
646 SendDlgItemMessage(GetParent(hwnd),IDC_PROCCOMBO,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
647 }
648 break;
649 }
650 return CallWindowProc(OldThreadComboProc,hwnd,message,wParam,lParam);
651}
652//IDC_PROCCOMBOプロシージャ
653LRESULT CALLBACK ProcComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
654 extern WNDPROC OldProcComboProc;
655 int i2,i3;
656 char temporary[MAX_PATH];
657
658 switch(message){
659 case WM_COMMAND:
660 if(HIWORD(wParam)==CBN_SELCHANGE){
661 i2=(int)SendMessage(hwnd,CB_GETCURSEL,0,0);
662 GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel-i2],&i3,temporary);
663 ShowErrorLine(i3,temporary);
664
665 RefreshLocalVar_with_WindowLock();
666 }
667 break;
668 }
669 return CallWindowProc(OldProcComboProc,hwnd,message,wParam,lParam);
670}
671void InitVarList(DWORD dwThreadId){
672 extern HWND hDebugWnd;
673 int i2,i3,i5;
674 char temporary[255];
675
676
677 //スレッド
678 SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_RESETCONTENT,0,0);
679 extern DWORD _DebugSys_dwThreadID[256];
680 for(i2=0;i2<256;i2++){
681 if(_DebugSys_dwThreadID[i2]){
682 sprintf(temporary,"&H%08X",_DebugSys_dwThreadID[i2]);
683 SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_ADDSTRING,0,(LPARAM)temporary);
684 if(_DebugSys_dwThreadID[i2]==dwThreadId){
685 extern int NextStepThreadNum;
686 NextStepThreadNum=i2;
687 }
688 }
689 }
690 sprintf(temporary,"&H%08X",dwThreadId);
691 i5=(int)SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_FINDSTRING,0,(LPARAM)temporary);
692 SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_SETCURSEL,i5,0);
693
694 i2=SetDebugProcCombo(GetDlgItem(hDebugWnd,IDC_PROCCOMBO));
695
696
697 ///////////////////////////////////////////////
698 // 実行中のプロシージャのローカル変数をセット
699 ///////////////////////////////////////////////
700
701 extern VARIABLE *LocalVar;
702 extern int MaxLocalVarNum;
703 int sw;
704
705 MaxLocalVarNum=0;
706
707 i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
708 i2=pobj_dti->iProcLevel-i2;
709
710 if(pobj_dti->lplpSpBase[i2]){
711 extern SUBINFO **ppSubHash;
712 SUBINFO *psi;
713 for(i3=0,sw=0;i3<MAX_HASH;i3++){
714 psi=ppSubHash[i3];
715 while(psi){
716 if(rva_to_real(psi->CompileAddress) <= pobj_dti->lplpObp[i2] &&
717 pobj_dti->lplpObp[i2] < rva_to_real(psi->EndOpAddr)){
718 sw=1;
719 break;
720 }
721
722 psi=psi->pNextData;
723 }
724 if(sw) break;
725 }
726
727
728 if(psi){
729 LocalVar=psi->pVar;
730 MaxLocalVarNum=psi->VarNum;
731
732 pobj_CompilingClass=psi->pobj_ParentClass;
733 }
734 }
735
736
737 ////////////////////////
738 // 変数リストを再表示
739 ////////////////////////
740
741 //処理時間を短くするため、一時的に非表示にする
742 LockWindowUpdate(hDebugWnd);
743 ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
744 ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_HIDE);
745
746 //リフレッシュ
747 RefreshLocalVar();
748 RefreshGlobalVar();
749 RefreshWatchList();
750
751 LockWindowUpdate(NULL);
752 ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
753 ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_SHOW);
754}
755
756
757
758
759//////////////////////////////////////
760// エディタに埋め込み表示のデバッガ
761//////////////////////////////////////
762
763BOOL CALLBACK DebuggerButtonsProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
764 extern HINSTANCE hInst;
765 extern DWORD dwStepRun;
766
767 //デバッガ用ツールバー
768#define BMPNUM_DEBUGGERTOOLBAR 3
769#define BTNNUM_DEBUGGERTOOLBAR 4
770 TBBUTTON DebuggerToolBar[]={
771 {0,IDC_DEBUG_START,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
772 {0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
773 {1,IDC_DEBUG_STEPOVER,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
774 {2,IDC_DEBUG_STEPIN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
775 };
776 TOOLTIPTEXT *pTipText;
777
778 static HIMAGELIST hImageList,hImageList_Disabled;
779
780 switch(message){
781 case WM_INITDIALOG:
782 //ツールバーを生成
783 extern HWND hDebuggerToolbar;
784 hDebuggerToolbar=CreateToolbarEx(hwnd,WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|WS_CLIPSIBLINGS,
785 NULL,
786 0,0,0,
787 DebuggerToolBar,
788 BTNNUM_DEBUGGERTOOLBAR, /*アイテムの個数*/
789 0,0,16,15,sizeof(TBBUTTON));
790
791 hImageList = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR),
792 16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
793 SendMessage(hDebuggerToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
794 hImageList_Disabled = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR_DISABLED),
795 16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
796 SendMessage(hDebuggerToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList_Disabled);
797
798 break;
799 case WM_COMMAND:
800 switch(LOWORD(wParam)){
801 case IDC_DEBUG_START:
802 DestroyWindow(GetParent(hwnd));
803 return 1;
804 case IDC_DEBUG_STEPIN:
805 dwStepRun=1;
806 return 1;
807 case IDC_DEBUG_STEPOVER:
808 dwStepRun=2;
809 return 1;
810 }
811 break;
812 case WM_NOTIFY:
813 pTipText=(TOOLTIPTEXT *)lParam;
814 if(pTipText->hdr.code==TTN_NEEDTEXT){
815 //ツールチップを表示
816 switch(pTipText->hdr.idFrom){
817 case IDC_DEBUG_START:
818 pTipText->lpszText="実行";
819 break;
820 case IDC_DEBUG_STEPOVER:
821 pTipText->lpszText="ステップ アウト";
822 break;
823 case IDC_DEBUG_STEPIN:
824 pTipText->lpszText="ステップ イン";
825 break;
826 }
827 }
828 break;
829 case WM_SIZE:
830 MoveWindow(hDebuggerToolbar,0,0,LOWORD(lParam),HIWORD(lParam),1);
831 return 1;
832
833 case WM_DESTROY:
834 ImageList_Destroy(hImageList);
835 ImageList_Destroy(hImageList_Disabled);
836 return 1;
837 }
838 return 0;
839}
840
841WNDPROC OldTabProc;
842LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
843 extern HINSTANCE hInst;
844
845 static HMENU hDummyMenu,hMenu=0;
846
847 switch(message){
848 case WM_CONTEXTMENU:
849 if(hMenu==0){
850 hDummyMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_DEBUGGER_VARLIST_MENU));
851 hMenu=GetSubMenu(hDummyMenu,0);
852 }
853
854 MENUITEMINFO mi;
855 mi.cbSize=sizeof(MENUITEMINFO);
856 mi.fMask=MIIM_STATE;
857 mi.fState=MFS_CHECKED;
858
859 if(pobj_nv->bShow_DefaultSystem_Var)
860 SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
861 if(pobj_nv->bShow_Rad_Var)
862 SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
863 if(pobj_nv->bShow_GUID_Var)
864 SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
865
866 TrackPopupMenu(hMenu,TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
867
868 break;
869 case WM_COMMAND:
870 mi.cbSize=sizeof(MENUITEMINFO);
871 mi.fMask=MIIM_STATE;
872 switch(LOWORD(wParam)){
873 case IDM_SHOW_DEFAULTSYSTEM_VAR:
874 if(pobj_nv->bShow_DefaultSystem_Var){
875 pobj_nv->bShow_DefaultSystem_Var=0;
876 mi.fState=MFS_UNCHECKED;
877 }
878 else{
879 pobj_nv->bShow_DefaultSystem_Var=1;
880 mi.fState=MFS_CHECKED;
881 }
882 SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
883 RefreshGlobalVar_with_WindowLock();
884 break;
885 case IDM_SHOW_RAD_VAR:
886 if(pobj_nv->bShow_Rad_Var){
887 pobj_nv->bShow_Rad_Var=0;
888 mi.fState=MFS_UNCHECKED;
889 }
890 else{
891 pobj_nv->bShow_Rad_Var=1;
892 mi.fState=MFS_CHECKED;
893 }
894 SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
895 RefreshGlobalVar_with_WindowLock();
896 break;
897 case IDM_SHOW_GUID_VAR:
898 if(pobj_nv->bShow_GUID_Var){
899 pobj_nv->bShow_GUID_Var=0;
900 mi.fState=MFS_UNCHECKED;
901 }
902 else{
903 pobj_nv->bShow_GUID_Var=1;
904 mi.fState=MFS_CHECKED;
905 }
906 SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
907 RefreshGlobalVar_with_WindowLock();
908 break;
909 }
910 break;
911 case WM_DESTROY:
912 DestroyMenu(hMenu);
913 hMenu=0;
914 break;
915 }
916 return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
917}
918
919BOOL CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
920 extern HANDLE hHeap;
921 extern HINSTANCE hInst;
922 extern DWORD dwStepRun;
923 extern double width_ratio_VarList;
924 RECT rect;
925 int i,i2,i3;
926 char temporary[VN_SIZE];
927 LV_DISPINFO *lvinfo;
928 LVITEM ListView_Item;
929
930 static POINT pos_VarList;
931 static POINT pos_WatchList;
932
933 switch(message){
934 case WM_INITDIALOG:
935 extern HWND hDebugWnd;
936 hDebugWnd=hwnd;
937
938 //変数リストの初期位置を取得
939 GetWindowRect(GetDlgItem(hwnd,IDC_VARPOS),&rect);
940 pos_VarList.x=rect.left;
941 pos_VarList.y=rect.top;
942 ScreenToClient(hwnd,&pos_VarList);
943
944 //ウォッチリストの初期位置を取得
945 pos_WatchList.x=pos_VarList.x+(rect.right-rect.left)+LEVER_THICK;
946 pos_WatchList.y=0;
947
948 //ツールバーのベースウィンドウを生成
949 static HWND hBase_ToolBar;
950 hBase_ToolBar=CreateDialog(hInst,MAKEINTRESOURCE(IDD_DEBUGGER_TOOLBARBASE),hwnd,(DLGPROC)DebuggerButtonsProc);
951 MoveWindow(hBase_ToolBar,50,0,20*BTNNUM_DEBUGGERTOOLBAR,22,1);
952
953 extern WNDPROC OldThreadComboProc;
954 OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
955 SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
956
957 extern WNDPROC OldProcComboProc;
958 OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
959 SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
960
961
962 ///////////////////////////
963 // タブコントロールを生成
964 ///////////////////////////
965
966 static HWND hTab;
967 HFONT hFont;
968 hFont=(HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
969 hTab=CreateWindow(WC_TABCONTROL,NULL,
970 WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
971 0,0,0,0,hwnd,0,hInst,0);
972 SendMessage(hTab,WM_SETFONT,(WPARAM)hFont,0);
973 OldTabProc=(WNDPROC)GetWindowLongPtr(hTab,GWLP_WNDPROC);
974 SetWindowLongPtr(hTab,GWLP_WNDPROC,(LONG_PTR)TabProc);
975
976 //タブを設定
977 TC_ITEM tcItem;
978 tcItem.mask=TCIF_TEXT;
979 tcItem.pszText="グローバル";
980 SendMessage(hTab,TCM_INSERTITEM,0,(LPARAM)&tcItem);
981 tcItem.mask=TCIF_TEXT;
982 tcItem.pszText="ローカル";
983 SendMessage(hTab,TCM_INSERTITEM,1,(LPARAM)&tcItem);
984 tcItem.mask=TCIF_TEXT;
985 tcItem.pszText="This";
986 SendMessage(hTab,TCM_INSERTITEM,2,(LPARAM)&tcItem);
987
988 //グローバル変数リストのツリーを作成
989 hVarTree_Global=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
990 WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
991 0,0,0,0,
992 hTab,0,hInst,0);
993
994 //ローカル変数リストのツリーを作成
995 hVarTree_Local=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
996 WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
997 0,0,0,0,
998 hTab,0,hInst,0);
999
1000 //This変数リストのツリーを作成
1001 hVarTree_This=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
1002 WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
1003 0,0,0,0,
1004 hTab,0,hInst,0);
1005
1006 ShowWindow(hVarTree_Global,SW_SHOW);
1007
1008
1009 //イメージリスト読み込み、設定
1010 static HIMAGELIST hVariOrderImageList;
1011 hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
1012 ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
1013 ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
1014 ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
1015 ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
1016 ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
1017 TreeView_SetImageList(hVarTree_Global,hVariOrderImageList,TVSIL_NORMAL);
1018 TreeView_SetImageList(hVarTree_Local,hVariOrderImageList,TVSIL_NORMAL);
1019 TreeView_SetImageList(hVarTree_This,hVariOrderImageList,TVSIL_NORMAL);
1020
1021
1022 /////////////////////////
1023 // ウォッチリスト
1024 /////////////////////////
1025
1026 //コラムの設定
1027 static HWND hListView;
1028 LV_COLUMN ListView_Column;
1029 DWORD dwStyle;
1030
1031 hListView=GetDlgItem(hwnd,IDC_WATCHLIST);
1032 GetClientRect(hListView,&rect);
1033 dwStyle=ListView_GetExtendedListViewStyle(hListView);
1034 dwStyle|=LVS_EX_FULLROWSELECT;
1035 ListView_SetExtendedListViewStyle(hListView,dwStyle);
1036
1037 ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
1038 ListView_Column.fmt=LVCFMT_LEFT;
1039
1040 extern int width_WatchColumn_Expression;
1041 ListView_Column.cx=width_WatchColumn_Expression;
1042 ListView_Column.pszText="ウォッチ式";
1043 ListView_Column.iSubItem=0;
1044 ListView_InsertColumn(hListView,0,&ListView_Column);
1045
1046 extern int width_WatchColumn_Value;
1047 ListView_Column.cx=width_WatchColumn_Value;
1048 ListView_Column.pszText="値";
1049 ListView_Column.iSubItem=1;
1050 ListView_InsertColumn(hListView,1,&ListView_Column);
1051
1052 //アイテムの設定
1053 ListView_Item.mask=LVIF_TEXT;
1054 ListView_Item.iSubItem=0;
1055 for(i=0;i<pobj_nv->WatchNum;i++){
1056 ListView_Item.pszText=pobj_nv->ppWatchStr[i];
1057 ListView_Item.iItem=i;
1058 ListView_InsertItem(hListView,&ListView_Item);
1059 }
1060 ListView_Item.pszText="...";
1061 ListView_Item.iItem=i;
1062 ListView_InsertItem(hListView,&ListView_Item);
1063
1064
1065 ///////////////////////
1066 // 変数リストの初期化
1067 ///////////////////////
1068 InitVarList((DWORD)lParam);
1069
1070 break;
1071 case WM_NOTIFY:
1072 NMHDR *hdr;
1073 hdr=(NMHDR *)lParam;
1074 if(hdr->hwndFrom==hTab&&hdr->code==TCN_SELCHANGE){
1075 i=TabCtrl_GetCurSel(hTab);
1076
1077 if(i==0){
1078 //グローバル変数を表示
1079 ShowWindow(hVarTree_Global,SW_SHOW);
1080 ShowWindow(hVarTree_Local,SW_HIDE);
1081 ShowWindow(hVarTree_This,SW_HIDE);
1082 }
1083 else if(i==1){
1084 //ローカル変数を表示
1085 ShowWindow(hVarTree_Global,SW_HIDE);
1086 ShowWindow(hVarTree_Local,SW_SHOW);
1087 ShowWindow(hVarTree_This,SW_HIDE);
1088 }
1089 else if(i==2){
1090 //This変数を表示
1091 ShowWindow(hVarTree_Global,SW_HIDE);
1092 ShowWindow(hVarTree_Local,SW_HIDE);
1093 ShowWindow(hVarTree_This,SW_SHOW);
1094 }
1095 }
1096
1097 if(hdr->hwndFrom==hListView){
1098 lvinfo=(LV_DISPINFO *)hdr;
1099 if(hdr->code==NM_DBLCLK){
1100 i2=ListView_GetItemCount(hListView);
1101 for(i=0;i<i2;i++){
1102 if(ListView_GetItemState(hListView,i,LVIS_SELECTED)) break;
1103 }
1104 if(i==i2) break;
1105
1106 ListView_EditLabel(hListView,i);
1107 }
1108
1109 static HWND hEdit;
1110 if(hdr->code==LVN_BEGINLABELEDIT){
1111 hEdit=ListView_GetEditControl(hListView);
1112
1113 GetWindowText(hEdit,temporary,VN_SIZE);
1114 if(lstrcmp(temporary,"...")==0) SetWindowText(hEdit,"");
1115 }
1116 if(hdr->code==LVN_ENDLABELEDIT){
1117 GetWindowText(hEdit,temporary,VN_SIZE);
1118 if(temporary[0]=='\0'){
1119 if(ListView_GetItemCount(hListView)-1==lvinfo->item.iItem) break;
1120
1121 //空白入力の場合はそのアイテムを削除する
1122 ListView_DeleteItem(hListView,lvinfo->item.iItem);
1123 break;
1124 }
1125 ListView_SetItemText(hListView,lvinfo->item.iItem,0,temporary);
1126
1127 //演算結果を表示
1128 SetCalcToWatchList(hListView,lvinfo->item.iItem,temporary);
1129
1130 if(lvinfo->item.iItem==ListView_GetItemCount(hListView)-1){
1131 //リストアイテムを追加
1132 ListView_Item.mask=LVIF_TEXT;
1133 ListView_Item.pszText="...";
1134 ListView_Item.iItem=lvinfo->item.iItem+1;
1135 ListView_Item.iSubItem=0;
1136 ListView_InsertItem(hListView,&ListView_Item);
1137 }
1138 }
1139
1140 if(hdr->code==LVN_KEYDOWN){
1141 LV_KEYDOWN *plvKeydown;
1142 plvKeydown=(LV_KEYDOWN *)hdr;
1143 if(plvKeydown->wVKey==VK_DELETE){
1144 i2=ListView_GetItemCount(hListView);
1145 for(i=i2-2;i>=0;i--){
1146 if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
1147 ListView_DeleteItem(hListView,i);
1148 i3=i;
1149 }
1150 }
1151
1152 ListView_SetItemState(hListView,i3,LVIS_SELECTED,LVIS_SELECTED);
1153 }
1154 }
1155 }
1156 break;
1157
1158 case WM_SIZE:
1159 //変数リストの位置
1160 int width_VarList;
1161 width_VarList=
1162 (int)((double)(LOWORD(lParam)-pos_VarList.x)*width_ratio_VarList);
1163
1164 MoveWindow(hTab,
1165 pos_VarList.x,
1166 pos_VarList.y,
1167 width_VarList,
1168 HIWORD(lParam)-pos_VarList.y,
1169 1);
1170
1171 GetClientRect(hTab,&rect);
1172 TabCtrl_AdjustRect(hTab,FALSE,&rect);
1173 rect.left-=2;
1174 rect.right++;
1175 rect.bottom++;
1176
1177 MoveWindow(hVarTree_Global,
1178 rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
1179 MoveWindow(hVarTree_Local,
1180 rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
1181 MoveWindow(hVarTree_This,
1182 rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
1183
1184 pos_WatchList.x=pos_VarList.x+width_VarList+LEVER_THICK;
1185 pos_WatchList.y=0;
1186
1187 //ウォッチリストの位置
1188 MoveWindow(GetDlgItem(hwnd,IDC_WATCHLIST),
1189 pos_WatchList.x,
1190 pos_WatchList.y,
1191 LOWORD(lParam)-pos_WatchList.x,
1192 HIWORD(lParam)-pos_WatchList.y,
1193 1);
1194
1195 return 1;
1196
1197 case WM_VARLIST_CLOSE:
1198 DestroyWindow(hwnd);
1199 return 1;
1200 case WM_DESTROY:
1201 ImageList_Destroy(hVariOrderImageList);
1202
1203
1204 //////////////////////////////////////////////////////////////
1205 // ウォッチリストの以前の内容を破棄し、新しい内容に書き換える
1206 //////////////////////////////////////////////////////////////
1207
1208 for(i=0;i<pobj_nv->WatchNum;i++){
1209 HeapDefaultFree(pobj_nv->ppWatchStr[i]);
1210 }
1211 HeapDefaultFree(pobj_nv->ppWatchStr);
1212
1213 pobj_nv->WatchNum=ListView_GetItemCount(hListView)-1;
1214 pobj_nv->ppWatchStr=(char **)HeapAlloc(hHeap,0,pobj_nv->WatchNum*sizeof(char *)+1);
1215 for(i=0;i<pobj_nv->WatchNum;i++){
1216 ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
1217 pobj_nv->ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
1218 lstrcpy(pobj_nv->ppWatchStr[i],temporary);
1219 }
1220
1221
1222 //////////////////////////////
1223 // デバッグダイアログを破棄
1224 //////////////////////////////
1225
1226 hDebugWnd=0;
1227
1228 extern BOOL bClipCompileView;
1229 if(bClipCompileView){
1230 extern HWND hOwnerEditor;
1231 SendMessage(hOwnerEditor,WM_DESTROYDEBUGGERVIEW,0,0);
1232 }
1233
1234 return 1;
1235
1236
1237
1238 ///////////////////////
1239 // デバッグコマンド
1240 ///////////////////////
1241
1242 case WM_DEBUG_CONTINUE:
1243 DestroyWindow(hwnd);
1244 return 1;
1245 case WM_STEP_IN:
1246 Debugger_StepIn();
1247 return 1;
1248 case WM_STEP_OVER:
1249 Debugger_StepOver();
1250 return 1;
1251 case WM_STEP_CURSOR:
1252 Debugger_StepCursor();
1253 return 1;
1254 }
1255 return 0;
1256}
1257
1258
1259
1260
1261//////////////////////////////////
1262// ポップアップ表示の変数リスト
1263//////////////////////////////////
1264
1265BOOL CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
1266 extern HANDLE hHeap;
1267 extern HINSTANCE hInst;
1268 extern DWORD dwStepRun;
1269 RECT rect;
1270 POINT pos;
1271 SIZE size;
1272
1273 switch(message){
1274 case WM_INITDIALOG:
1275 extern HWND hDebugWnd;
1276 hDebugWnd=hwnd;
1277
1278 pos.x=pobj_nv->VarDlgRect.left;
1279 pos.y=pobj_nv->VarDlgRect.top;
1280 size.cx=pobj_nv->VarDlgRect.right-pobj_nv->VarDlgRect.left;
1281 size.cy=pobj_nv->VarDlgRect.bottom-pobj_nv->VarDlgRect.top;
1282 MoveWindow(hwnd,pos.x,pos.y,size.cx,size.cy,1);
1283
1284 extern WNDPROC OldThreadComboProc;
1285 OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
1286 SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
1287
1288 extern WNDPROC OldProcComboProc;
1289 OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
1290 SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
1291
1292 //イメージリスト読み込み、設定
1293 static HIMAGELIST hVariOrderImageList;
1294 hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
1295 ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
1296 ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
1297 ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
1298 ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
1299 ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
1300 TreeView_SetImageList(GetDlgItem(hwnd,IDC_VARTREE),hVariOrderImageList,TVSIL_NORMAL);
1301
1302 InitVarList((DWORD)lParam);
1303 break;
1304 case WM_COMMAND:
1305 switch(LOWORD(wParam)){
1306 case IDCANCEL:
1307 DestroyWindow(hwnd);
1308 return 1;
1309 case IDC_STEPIN:
1310 dwStepRun=1;
1311 return 1;
1312 case IDC_STEPOVER:
1313 dwStepRun=2;
1314 return 1;
1315 }
1316 break;
1317 case WM_SIZE:
1318 GetWindowRect(GetDlgItem(hwnd,IDC_VARTREE),&rect);
1319 pos.x=rect.left;
1320 pos.y=rect.top;
1321 ScreenToClient(hwnd,&pos);
1322 MoveWindow(GetDlgItem(hwnd,IDC_VARTREE),0,pos.y,LOWORD(lParam),HIWORD(lParam)-pos.y,TRUE);
1323 SetWindowPos(GetDlgItem(hwnd,IDCANCEL),0,LOWORD(lParam)-91,9,0,0,SWP_NOSIZE);
1324 return 1;
1325 case WM_VARLIST_CLOSE:
1326 DestroyWindow(hwnd);
1327 return 1;
1328 case WM_DESTROY:
1329 ImageList_Destroy(hVariOrderImageList);
1330
1331 GetWindowRect(hwnd,&pobj_nv->VarDlgRect);
1332
1333 hDebugWnd=0;
1334
1335 return 1;
1336 }
1337 return 0;
1338}
Note: See TracBrowser for help on using the repository browser.