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

Last change on this file since 763 was 763, checked in by イグトランス (egtra), 15 years ago

#228試行

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