- 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
HRESULT GetOutlookVersionString(LPSTR* ppszVer, BOOL* pf64Bit)
{
HRESULT hr = E_FAIL;
LPSTR pszTempPath = NULL;
LPSTR pszTempVer = NULL;
TCHAR pszaOutlookQualifiedComponents[][MAX_PATH] = {
TEXT("{1E77DE88-BCAB-4C37-B9E5-073AF52DFD7A}"), // Outlook 2010
TEXT("{24AAE126-0911-478F-A019-07B875EB9996}"), // Outlook 2007
TEXT("{BC174BAD-2F53-4855-A1D5-0D575C19B1EA}") // Outlook 2003
};
int nOutlookQualifiedComponents = _countof(pszaOutlookQualifiedComponents);
int i = 0;
DWORD dwValueBuf = 0;
UINT ret = 0;
*pf64Bit = FALSE;
for (i = 0; i < nOutlookQualifiedComponents; i++)
{
ret = MsiProvideQualifiedComponent(
pszaOutlookQualifiedComponents[i],
TEXT("outlook.x64.exe"),
(DWORD) INSTALLMODE_DEFAULT,
NULL,
&dwValueBuf);
if (ERROR_SUCCESS == ret) break;
}
if (ret != ERROR_SUCCESS)
{
ret = MsiProvideQualifiedComponent(
pszaOutlookQualifiedComponents[i],
TEXT("outlook.exe"),
(DWORD) INSTALLMODE_DEFAULT,
NULL,
&dwValueBuf);
}
else
{
*pf64Bit = TRUE;
}
if (ret == ERROR_SUCCESS)
{
dwValueBuf += 1;
pszTempPath = (LPSTR) malloc(dwValueBuf * sizeof(TCHAR));
if (pszTempPath != NULL)
{
if ((ret = MsiProvideQualifiedComponent(
pszaOutlookQualifiedComponents[i],
TEXT("outlook.exe"),
(DWORD) INSTALLMODE_EXISTING,
pszTempPath,
&dwValueBuf)) != ERROR_SUCCESS)
{
goto Error;
}
pszTempVer = (LPSTR) malloc(MAX_PATH * sizeof(TCHAR));
dwValueBuf = MAX_PATH;
if ((ret = MsiGetFileVersion(pszTempPath,
pszTempVer,
&dwValueBuf,
NULL,
NULL))!= ERROR_SUCCESS)
{
goto Error;
}
*ppszVer = pszTempVer;
pszTempVer = NULL;
hr = S_OK;
}
}
Error:
free(pszTempVer);
free(pszTempPath);
return hr;
}
Говнокод от САМОГО Билли... 21 век на дворе, а у нас в C++ коде goto Error написано (точнее - накакано).
Источник - http://msdn.microsoft.com/en-us/library/dd941331.aspx
guest 09.09.2011 11:26 # +11
CPPGovno 09.09.2011 12:38 # 0
TarasB 09.09.2011 16:18 # 0
roman-kashitsyn 09.09.2011 16:27 # +2
В MS коде везде так ошибки обрабатываются, это стало идиомой. Кроме того, такое использование goto приветствует Макконнелл: меньше дублирования кода.
gegMOPO4 09.09.2011 16:56 # +3
TarasB 09.09.2011 17:27 # −1
CPPGovno 10.09.2011 15:37 # 0
И так после вызова каждой функции. По моему это лучше, чем
TarasB 10.09.2011 17:37 # 0
CPPGovno 10.09.2011 20:38 # 0
Особенно с учетом того, что b ещё может быть не создан, когда мы входим в err. Поэтому, с такой практикой err приходится удалять все объекты вручную внутри if'а перед переходом goto err;.
Есть, конечно, реализации SafeRelease, но это костыль.
Гуглите реализацию ComPtr<IТипИнтерфейс> comObj.
Этот частный случай смартпоинтера сам вызовет Release, даже если неожиданно произойдет исключение. Да и работать с ним удобнее, чем с голым интерфейсом.
TarasB 10.09.2011 20:50 # 0
Я понимаю, что на РАИИ всё это делается вообще без усилий и само по себе.
Но если говорить про низкий уровень, то гото - лучший вариант. Ну и отдельно флаги, хранящие, кого мы созали, а кого-нет.
CPPGovno 10.09.2011 21:08 # 0
TarasB 10.09.2011 23:23 # 0
CPPGovno 10.09.2011 23:53 # 0
Даже системные функции можно на С++ писать, главное наружу выдавать Си интерфейс и не выпускать исключений.
TarasB 11.09.2011 10:02 # 0
Это проще, если сразу всё на чистом Си писать.
CPPGovno 11.09.2011 10:05 # 0
gegMOPO4 11.09.2011 20:00 # +1
guest 16.09.2011 20:44 # +2
SmackMyBitchUp 11.09.2011 21:09 # +7
Странно, с такой фамилией и против дублирования.
TarasB 11.09.2011 21:16 # +2
Маконелмаконел
А так он провёл оптимизацию и сделал так, что дублируются только три буквы.
Lure Of Chaos 12.09.2011 00:49 # +2
absolut 12.09.2011 09:19 # +3
Ему пришлось иметь дело с наследованием старого кода
wvxvw 09.09.2011 14:28 # 0
TarasB 09.09.2011 11:30 # +9
kVolt 09.09.2011 22:16 # +2
guest 09.09.2011 11:32 # −1
roman-kashitsyn 09.09.2011 11:47 # +1
Всегда доставляло число аргументов в API -функциях мелкомягких.
lucidfox 09.09.2011 12:04 # +9
E от слова Epic?
CPPGovno 09.09.2011 12:37 # 0
SmackMyBitchUp 09.09.2011 12:25 # 0
TheHamstertamer 09.09.2011 12:57 # +1
тоже мне новость.
Lure Of Chaos 09.09.2011 13:18 # +2
roman-kashitsyn 09.09.2011 13:06 # +2
Да ладно, всем понятно, что это написали индусы за чизбургер и баночку колы
Lure Of Chaos 09.09.2011 13:18 # 0
кажется, это эпидемия
SmackMyBitchUp 09.09.2011 14:11 # −1
AxisPod 09.09.2011 14:35 # −5
inkanus-gray 09.09.2011 15:03 # 0
roman-kashitsyn 09.09.2011 15:08 # +9
TheHamstertamer 10.09.2011 14:07 # 0
TarasB 10.09.2011 14:38 # 0
TheHamstertamer 10.09.2011 20:52 # 0
Lure Of Chaos 11.09.2011 01:21 # 0
gegMOPO4 09.09.2011 16:53 # +4
roman-kashitsyn 09.09.2011 17:32 # 0
ret между этими вызовами мог измениться (строка 32)
в 30-42 вообще какой-то трэш происходит. Почему x64 версия проверяется для всех ключей, а x86 - не для всех?
gegMOPO4 09.09.2011 18:02 # 0
TarasB 09.09.2011 18:06 # 0
gegMOPO4 09.09.2011 18:09 # 0
lucidfox 09.09.2011 18:10 # +3
Lure Of Chaos 09.09.2011 21:50 # +1
roman-kashitsyn 09.09.2011 21:55 # +4
Lure Of Chaos 09.09.2011 21:57 # +1
roman-kashitsyn 09.09.2011 22:00 # +1
inkanus-gray 09.09.2011 22:48 # +1
roman-kashitsyn 09.09.2011 22:56 # 0
kVolt 09.09.2011 23:18 # 0
TarasB 10.09.2011 10:03 # 0
rat4 10.09.2011 14:56 # −1
TarasB 10.09.2011 23:24 # 0
Это системная функция, её вызывают из разных языков, поэтому нельзя в её сигнатуре писать ничего сложнее указателей и целых чисел, иначе с форматом объектов будет путаница.
rat4 11.09.2011 08:59 # +2
CPPGovno 11.09.2011 09:11 # 0
Лучше с использованием RAII. Не путать с Red Alert II Это более удобно, безопасно и менее многословно.
3.14159265 16.09.2011 18:53 # −2
Кто-нибудь сказал, об использовании?
так структурней.
guest 16.09.2011 20:47 # +4
while(((false==true)!=true ? 0 : 1) > 0)
guest 23.09.2011 23:53 # 0
carsten 01.10.2011 23:52 # 0
Как-то эстетически не очень приятно мешать коды возврата с исключениями.
guest8 09.04.2019 11:29 # −999