C ++ Builder 12.2 Ошибка: «не может использовать C ++ 'try' в той же функции, что и seh '__try'»C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C ++ Builder 12.2 Ошибка: «не может использовать C ++ 'try' в той же функции, что и seh '__try'»

Сообщение Anonymous »

После сбоя компьютера и переустановки строителя C ++ 12.2 на новом компьютере какой -то код больше не компилируется. Например: < /p>

Код: Выделить всё

void __fastcall TSynCustomExporter::CopyToClipboardFormat(UINT AFormat)
...
try // line 206
{
PtrData = ((Byte*) GlobalLock((HGLOBAL) hData));
if(ASSIGNED(PtrData))
{
try // line 211
{
fBuffer->Position = 0;
fBuffer->Read((void**)PtrData, (TNativeCount) (hDataSize - 1)); // trailing #0
}
__finally
{
GlobalUnlock((HGLOBAL) hData);
}
Clipboard()->SetAsHandle(AFormat, hData);
}
else
Abort();
}
catch(...)
{
GlobalFree((HGLOBAL) hData);
OutOfMemoryError();
}
< /code>
Сообщение об ошибке: < /p>
[bcc64x Error] SynEditExport.cpp(206): cannot use C++ 'try' in the same function as SEH '__try'
[bcc64x Hint] SynEditExport.cpp(211): conflicting '__try' here
Существуют объяснения для таких сообщений об ошибках для других компиляторов, но C ++ Builder имеет свое специальное __finally расширение для воспроизведения поведения Delphi.
Я обнаружил, что есть патч, который, вероятно, отвечает за новое поведение: < /p>
rss-698: попробуйте, наконец, ошибку поймать в соответствии с win64x < /p>
< P> К сожалению, я не могу войти там. Если патч действительно ответственен за него, мне интересно, не создает ли патч больше ошибок, чем исправляет ошибки. > < /p>
Спасибо за ваши предложения обойти проблему. Но, чтобы держать мой вопрос коротким, я недостаточно объяснил его фон. p>

Код: Выделить всё

procedure TSynCustomExporter.CopyToClipboardFormat(AFormat: UINT);
...
try
PtrData := GlobalLock(hData);
if Assigned(PtrData) then
begin
try
fBuffer.Position := 0;
fBuffer.Read(PtrData^, hDataSize - 1); // trailing #0
finally
GlobalUnlock(hData);
end;
Clipboard.SetAsHandle(AFormat, hData);
end
else
Abort;
except
GlobalFree(hData);
OutOfMemoryError;
end;
< /code>
Это преобразование несложное и может быть немедленно понято каждому пользователю. Ошибка теперь встречается часто. Создание специальной структуры для этого случая не будет решением для других случаев. Использование scope_exit 
было бы общим решением, но не интуитивно. Я не понимаю, почему код внезапно перестал работать.


Подробнее здесь: https://stackoverflow.com/questions/792 ... as-seh-try
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»