source: dev/trunk/ab5.0/abdev/abdev/Attach.cpp@ 681

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

構成管理を大幅に改良。

File size: 8.2 KB
Line 
1#include "stdafx.h"
2
3#ifndef THETEXT
4
5#include "common.h"
6#include <psapi.h>
7#include <tlhelp32.h>
8
9#pragma comment(lib, "psapi.lib")
10
11using namespace ActiveBasic::IDE;
12
13
14int GetSelectingProcessId(HWND hListView,DWORD *lpdwPlatform){
15 int nCount;
16 nCount=ListView_GetItemCount(hListView);
17
18 char temporary[255];
19 DWORD dwProcessId;
20 int i;
21 for(i=0;i<nCount;i++){
22 if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
23 ListView_GetItemText(hListView,i,1,temporary,255);
24 dwProcessId=atoi(temporary);
25
26 ListView_GetItemText(hListView,i,2,temporary,255);
27 if(lstrcmpi(temporary,"Win32")==0) *lpdwPlatform=IMAGE_FILE_MACHINE_I386;
28 else if(lstrcmpi(temporary,"Win64")==0) *lpdwPlatform=IMAGE_FILE_MACHINE_AMD64;
29 break;
30 }
31 }
32 if(i==nCount) return 0;
33
34 return dwProcessId;
35}
36
37void InsertProcess_ToListView(HWND hListView,char *lpszAppPath,int id,char *lpszPlatform,char *lpszTitle){
38 char szAppName[MAX_PATH],temp2[MAX_PATH];
39 _splitpath(lpszAppPath,NULL,NULL,szAppName,temp2);
40 lstrcat(szAppName,temp2);
41
42 //イメージリストを取得
43 HIMAGELIST hImageList;
44 hImageList=ListView_GetImageList(hListView,LVSIL_SMALL );
45
46 //アイコンを取得
47 int iImage;
48 SHFILEINFO shfi;
49 SHGetFileInfo(lpszAppPath, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON );
50 if(shfi.hIcon){
51 iImage=ImageList_AddIcon(hImageList,shfi.hIcon);
52 DestroyIcon(shfi.hIcon);
53 }
54 else iImage=-1;
55
56 char szId[255];
57 sprintf(szId,"%d",id);
58
59 //リストビューに追加
60 LV_ITEM item;
61 if(iImage==-1) item.mask=LVIF_TEXT;
62 else item.mask=LVIF_TEXT|LVIF_IMAGE;
63 item.iItem=0;
64
65 item.pszText=szAppName;
66 item.iSubItem=0;
67 item.iImage=iImage;
68 ListView_InsertItem(hListView,&item);
69
70 item.mask=LVIF_TEXT ;
71 item.pszText=szId;
72 item.iSubItem++;
73 ListView_SetItem(hListView,&item);
74
75 item.pszText=lpszPlatform;
76 item.iSubItem++;
77 ListView_SetItem(hListView,&item);
78
79 item.pszText=lpszTitle;
80 item.iSubItem++;
81 ListView_SetItem(hListView,&item);
82}
83
84void ListupProcesses64(HWND hListView)
85{
86 ListView_DeleteAllItems(hListView);
87
88
89 /////////////////////////////////////////////////////
90 // 64ビット版プロセス列挙モジュールを呼び出す
91 /////////////////////////////////////////////////////
92
93 std::string enumProcess64ExePath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\enum_process64\\enum_process64.exe";
94
95 STARTUPINFO si;
96 PROCESS_INFORMATION pi;
97 memset(&si,0,sizeof(STARTUPINFO));
98 si.cb=sizeof(STARTUPINFO);
99 CreateProcess(NULL,const_cast<char *>(enumProcess64ExePath.c_str()),NULL,NULL,0,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
100
101 WaitForSingleObject(pi.hProcess,INFINITE);
102
103
104 //////////////////////////////////
105 // 生成されたファイルの読み込み
106 //////////////////////////////////
107
108 std::string listPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\enum_process64\\list.dat";
109
110 char *buffer;
111 buffer=ReadBuffer_NonErrMsg( listPath );
112 if(!buffer) return;
113
114 int i=0;
115 char temporary[MAX_PATH];
116 while(1){
117 //ファイルパス
118 char szAppPath[MAX_PATH];
119 i=GetOneParameter(buffer,i,szAppPath);
120 if(szAppPath[0]=='\0') break;
121 RemoveStringQuotes(szAppPath);
122
123 //プロセスID
124 DWORD dwProcessId;
125 i=GetOneParameter(buffer,i,temporary);
126 if(temporary[0]=='\0') break;
127 dwProcessId=(DWORD)atoi(temporary);
128
129 //プラットフォーム
130 char szPlatform[255];
131 i=GetOneParameter(buffer,i,szPlatform);
132 if(temporary[0]=='\0') break;
133
134 //タイトル
135 char szTitle[255];
136 int i2;
137 for(i2=0;;i++,i2++){
138 if(IS_RETURN(buffer,i)||buffer[i]=='\0'){
139 szTitle[i2]=0;
140 break;
141 }
142 szTitle[i2]=buffer[i];
143 }
144
145
146 //リストビューへ追加
147 InsertProcess_ToListView(hListView,szAppPath,dwProcessId,szPlatform,szTitle);
148
149 if(buffer[i]=='\r'&&buffer[i+1]=='\n') i+=2;
150 if(buffer[i]=='\0') break;
151 }
152
153 HeapDefaultFree(buffer);
154}
155
156// EnumWindowsProcコールバック関数
157BOOL CALLBACK FindWindowProc(HWND hwnd, LPARAM lParam)
158{
159 HWND* pphWnd = (HWND*)lParam;
160 *pphWnd = hwnd;
161 return FALSE; /* 列挙を中断 */
162}
163void ListupProcesses(HWND hListView){
164 char temporary[MAX_PATH];
165
166 ListView_DeleteAllItems(hListView);
167
168 DWORD *pdwProcessId;
169 pdwProcessId=(DWORD *)HeapAlloc(hHeap,0,8192*sizeof(DWORD));
170
171 //プロセスを列挙
172 DWORD cbNeeded;
173 EnumProcesses(pdwProcessId,8192*sizeof(DWORD),&cbNeeded);
174
175 char szMyAppPath[MAX_PATH];
176 GetModuleFileName(GetModuleHandle(0),szMyAppPath,MAX_PATH);
177
178 int i;
179 for(i=0;i<(int)(cbNeeded/sizeof(DWORD));i++){
180
181 //プロセスIDを元にハンドルを取得
182 HANDLE hProcess;
183 hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,pdwProcessId[i]);
184 if(!hProcess) continue;
185
186 //そのプロセスにおける実行モジュールのインスタンスハンドルを取得
187 HINSTANCE hModule;
188 DWORD cbReturned;
189 if(!EnumProcessModules( hProcess, &hModule, sizeof(HINSTANCE), &cbReturned ))
190 continue;
191
192 //実行ファイル名を取得
193 GetModuleFileNameEx(hProcess,hModule,temporary,MAX_PATH);
194
195
196 //////////////////////////////
197 // ウィンドウタイトルを取得
198 //////////////////////////////
199
200 //スナップショットを取得
201 HANDLE hSnapshot;
202 hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
203
204 THREADENTRY32 te;
205 memset(&te,0,sizeof(THREADENTRY32));
206 te.dwSize=sizeof(THREADENTRY32);
207 if(Thread32First(hSnapshot,&te)){
208 do{
209 if(te.th32OwnerProcessID==pdwProcessId[i]){
210 break;
211 }
212 }while(Thread32Next(hSnapshot,&te));
213 }
214
215 HWND hwnd;
216 hwnd=0;
217 EnumThreadWindows(te.th32ThreadID,FindWindowProc,(LPARAM)&hwnd);
218
219 while(GetParent(hwnd)) hwnd=GetParent(hwnd);
220
221 char szWndTitle[1024];
222 szWndTitle[0]=0;
223 if(hwnd) GetWindowText(hwnd,szWndTitle,1024);
224
225 CloseHandle(hSnapshot);
226
227
228
229 CloseHandle(hProcess);
230
231 if(lstrcmpi(szMyAppPath,temporary)==0){
232 //自分自身(ProjectEditor.exe)は無視
233 continue;
234 }
235
236 //リストビューへ追加
237 InsertProcess_ToListView(hListView,temporary,pdwProcessId[i],"Win32",szWndTitle);
238 }
239
240 HeapDefaultFree(pdwProcessId);
241}
242
243BOOL CALLBACK DlgAttach(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
244 static HWND hListView;
245 static HIMAGELIST hImageList;
246 static DWORD *lpdwPlatform;
247 switch(message){
248 case WM_INITDIALOG:
249 SetPosCenter(hwnd);
250
251 lpdwPlatform=(DWORD *)lParam;
252
253 hListView=GetDlgItem(hwnd,IDC_PROCESSLIST);
254
255 //拡張スタイル
256 DWORD dwStyle;
257 dwStyle=ListView_GetExtendedListViewStyle(hListView);
258 dwStyle|=LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
259 ListView_SetExtendedListViewStyle(hListView,dwStyle);
260
261
262 //イメージリストの生成と設定
263 hImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,0,0);
264 ListView_SetImageList(hListView,hImageList,LVSIL_SMALL );
265
266
267 ///////////////////////////
268 // カラムをセット
269 ///////////////////////////
270
271 LV_COLUMN ListView_Column;
272 ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
273 ListView_Column.fmt=LVCFMT_LEFT;
274
275 ListView_Column.cx=150;
276 ListView_Column.pszText="プロセス名";
277 ListView_Column.iSubItem=0;
278 ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
279
280 ListView_Column.cx=70;
281 ListView_Column.pszText="ID";
282 ListView_Column.iSubItem++;
283 ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
284
285 ListView_Column.cx=50;
286 ListView_Column.pszText="種別";
287 ListView_Column.iSubItem++;
288 ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
289
290 ListView_Column.cx=200;
291 ListView_Column.pszText="タイトル";
292 ListView_Column.iSubItem++;
293 ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
294
295
296 //リスビューを更新
297 if(IsWow64()) ListupProcesses64(hListView);
298 else ListupProcesses(hListView);
299
300 break;
301 case WM_COMMAND:
302 switch(LOWORD(wParam)){
303 case IDOK:
304 EndDialog(hwnd,GetSelectingProcessId(hListView,lpdwPlatform));
305 return 1;
306 case IDCANCEL:
307 EndDialog(hwnd,0);
308 return 1;
309 }
310 return 0;
311
312 case WM_NOTIFY:
313 NMLISTVIEW *nmListView;
314 nmListView=(NMLISTVIEW *)lParam;
315 if(nmListView->hdr.hwndFrom==hListView){
316 if(nmListView->hdr.code==NM_DBLCLK){
317 if(nmListView->iItem==-1) return 1;
318 SendMessage(hwnd,WM_COMMAND,IDOK,0);
319 return 1;
320 }
321 }
322 break;
323
324 case WM_DESTROY:
325 ImageList_Destroy(hImageList);
326 return 1;
327 }
328 return 0;
329}
330
331
332#endif //THETEXT
Note: See TracBrowser for help on using the repository browser.