- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
bool getSelectedFile(wchar_t *out, bool skip) {
HWND hwndFind = GetForegroundWindow();
TCHAR g_szPath[BUF_SIZE];
TCHAR g_szItem[BUF_SIZE];
//g_szPath[0] = TEXT('\0');
//g_szItem[0] = TEXT('\0');
memset(g_szPath, 0, sizeof(TCHAR) * BUF_SIZE);
memset(g_szItem, 0, sizeof(TCHAR) * BUF_SIZE);
IShellWindows *psw;
if(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_IShellWindows, (void**)&psw) != S_OK) return false;
VARIANT v;
v.vt = VT_I4;
IDispatch *pdisp;
bool fFound = false;
bool pExtracted = false;
bool nExtracted = false;
for (V_I4(&v) = 0; !fFound && psw->Item(v, &pdisp) == S_OK; V_I4(&v)++) {
IWebBrowserApp *pwba;
if(SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba))) {
HWND hwndWBA;
if (SUCCEEDED(pwba->get_HWND((LONG_PTR*)&hwndWBA)) && hwndWBA == hwndFind) {
fFound = true;
IServiceProvider *psp;
if(SUCCEEDED(pwba->QueryInterface(IID_IServiceProvider, (void**)&psp))) {
IShellBrowser *psb;
if(SUCCEEDED(psp->QueryService(SID_STopLevelBrowser, IID_IShellBrowser, (void**)&psb))) {
IShellView *psv;
if(SUCCEEDED(psb->QueryActiveShellView(&psv))) {
IFolderView *pfv;
if(SUCCEEDED(psv->QueryInterface(IID_IFolderView, (void**)&pfv))) {
IPersistFolder2 *ppf2;
if(SUCCEEDED(pfv->GetFolder(IID_IPersistFolder2, (void**)&ppf2))) {
LPITEMIDLIST pidlFolder;
if(SUCCEEDED(ppf2->GetCurFolder(&pidlFolder))) {
if(SHGetPathFromIDList(pidlFolder, g_szPath)) {
pExtracted = true;
if(skip) {
lstrcpy(out, g_szPath);
out[lstrlen(g_szPath)] = 0;
return true;
}
}
int iFocus;
if(SUCCEEDED(pfv->GetFocusedItem(&iFocus))) {
LPITEMIDLIST pidlItem;
if (SUCCEEDED(pfv->Item(iFocus, &pidlItem))) {
IShellFolder *psf;
if (SUCCEEDED(ppf2->QueryInterface(IID_IShellFolder, (void**)&psf))) {
STRRET str;
if(SUCCEEDED(psf->GetDisplayNameOf(pidlItem, SHGDN_INFOLDER, &str))) {
StrRetToBuf(&str, pidlItem, g_szItem, 1024);
nExtracted = true;
int psz = lstrlen(g_szPath);
int isz = lstrlen(g_szItem);
if(pExtracted) {
lstrcpy(out, g_szPath);
out[psz] = '\\';
}
lstrcpy(out+psz+1, g_szItem);
out[psz + isz + 2] = 0;
}
psf->Release();
}
CoTaskMemFree(pidlItem);
}
}
CoTaskMemFree(pidlFolder);
}
ppf2->Release();
}
pfv->Release();
}
psv->Release();
}
psb->Release();
}
psp->Release();
}
}
pwba->Release();
}
pdisp->Release();
}
psw->Release();
return (pExtracted && nExtracted);
}
Две очаровательных (говно) лестницы из какой-то очередной переназначалки горячих клавиш в Windows.
Оригинал тут: https://github.com/mapseamoff/KeyBinder/blob/master/ShellHelper/ShellHelper/main.cpp
defecate-plusplus 29.05.2013 16:13 # +3
LispGovno 29.05.2013 20:20 # 0
LispGovno 29.05.2013 16:56 # 0
LispGovno 29.05.2013 16:57 # 0
Xom94ok 29.05.2013 18:32 # 0
LispGovno 29.05.2013 20:14 # 0
http://ideone.com/SuLk5o
PS: Обновил, дефекейстра снизу лучше высрал с do while
LispGovno 29.05.2013 20:19 # 0
http://ideone.com/52YbOs
guest 01.06.2013 09:13 # +2
MyguJIA 25.09.2018 15:51 # 0
Xom94ok 29.05.2013 20:41 # +2
Xom94ok 29.05.2013 18:31 # +4
А в эту кашу думать даже не хочется.
slbsomeone 29.05.2013 18:34 # 0
Я бы так сделал.
defecate-plusplus 29.05.2013 18:37 # 0
bormand 29.05.2013 18:53 # 0
defecate-plusplus 29.05.2013 18:58 # +1
в сишке switch (errlevel) мне нравится гораздо больше goto
bormand 29.05.2013 19:44 # +1
slbsomeone 29.05.2013 19:30 # 0
Но, если не сложно, то и то и другое давай.
defecate-plusplus 29.05.2013 19:42 # +3
для COM, в принципе, уже есть библиотечный CComPtr в сраном ATL, который сделает Release в деструкторе
на сишке - все варианты сводятся к тому, что надо проэмулировать try { ... } finally, это делается либо через goto (я не сторонник этого способа), либо через do { ... } while (0); с бряками
конкретно пример выше со сферическими initXXX() можно было бы сделать вот так:
movaxbx 29.05.2013 19:07 # +2
defecate-plusplus 29.05.2013 19:15 # +3
чтобы человек изначально приучался к хорошему и понятному
там вечно какой-то пиздей творится
movaxbx 29.05.2013 19:25 # +1
а потом дескрипторы освобождать
ничего лучше я не видел
bormand 29.05.2013 19:26 # +2
Я вот так делал:
1) сначала в переменные ложим NULL/INVALID_HANDLE_VALUE.
2) goto cleanup при любой ошибке
3) На cleanup: проверяем переменные на пустоту и вызываем соотв. функции для освобождения
defecate-plusplus 29.05.2013 19:30 # 0
bormand 29.05.2013 19:35 # 0
movaxbx 29.05.2013 19:43 # 0
bormand 29.05.2013 19:47 # 0
Тут этот самый do { ... } while (false) с бряками, имхо, ничуть не структурней чем одинокая метка и прыжки вперед.
movaxbx 29.05.2013 19:51 # 0
bormand 29.05.2013 19:55 # 0
1) эмуляция try ... finally
2) бряк из 2-3 вложенных циклов (все лучше чем флагоёбство)
3) хардкорный конченный автомат (читается легче чем свич и переменная со стейтом)
Xom94ok 29.05.2013 20:46 # 0
Барсик закаляет
bormand 29.05.2013 21:00 # 0
А еще можно было писать GOTO N*10 + 100 ;)
eth0 30.05.2013 17:51 # 0
Lure Of Chaos 30.05.2013 19:56 # +4
eth0 30.05.2013 20:58 # +2
bormand 30.05.2013 21:07 # +1
Ну, как вариант, можно превратить код в вермишель, засунув туда GOTO на свободное место ;)
Или подвинуть пару соседних команд чуть подальше: Как видим - пришлось поменять номер только в одной строке.
Lure Of Chaos 30.05.2013 21:32 # 0
eth0 31.05.2013 06:31 # 0
guest 01.06.2013 09:25 # 0
Lure Of Chaos 01.06.2013 09:33 # 0
guest 01.06.2013 10:00 # 0
Lure Of Chaos 01.06.2013 10:01 # 0
eth0 01.06.2013 15:29 # 0
defecate-plusplus 29.05.2013 21:15 # +1
с точки зрения говноэмуляции try {} визуальная вложенность кода в некий блок, за которым угадывается специфичный do {} while (0); неплохо намекает само по себе
а вот goto cleanup; такого профита не имеет
bormand 29.05.2013 21:25 # 0
LispGovno 30.05.2013 20:43 # +1
> delete foo;
Ну здрасти.
delete foo; хватит всем достаточно
bormand 30.05.2013 21:09 # +2
Круто я слился ;) Хотел написать освобождение какого-нибудь сишного ресурса, а написал бессмысленное и беспощадное крестоблядство. Вот к чему приводит спешка.
roman-kashitsyn 30.05.2013 21:16 # +1
bormand 30.05.2013 21:19 # +1
defecate-plusplus 30.05.2013 22:05 # +3
if (pwba) pwba->Release();
defecate-plusplus 30.05.2013 22:08 # 0
все мы не без греха, да, LispGovno? :)
http://ideone.com/dhg9nz
guest 01.06.2013 01:27 # 0
guest 01.06.2013 01:31 # 0
defecate-plusplus 01.06.2013 01:32 # +4
guest 01.06.2013 09:09 # +1
Xom94ok 31.05.2013 21:22 # 0
http://ideone.com/h6S0k0
guest 01.06.2013 01:32 # +1
guest 01.06.2013 09:24 # 0
LispGovno 29.05.2013 19:47 # −1
http://ideone.com/5vHOqv
Чё это посоны?
movaxbx 29.05.2013 19:50 # +1
bormand 29.05.2013 20:12 # +3
defecate-plusplus 29.05.2013 21:12 # +5
inkanus-gray 01.06.2013 03:12 # 0
guest 01.06.2013 09:08 # 0
inkanus-gray 01.06.2013 09:15 # 0
Dummy00001 29.05.2013 23:08 # +3
guest8 11.07.2020 03:51 # −999
qwe345asd 25.08.2021 10:04 # 0