source: dev/trunk/ab5.0/abdev/BasicCompiler_Common/VarList.cpp@ 636

Last change on this file since 636 was 636, checked in by dai_9181, 16 years ago

libファイルを跨ったテンプレート展開に対応。

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