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

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

Сообщение Anonymous »

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

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

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();
}
Сообщение об ошибке:

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

[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.
Я обнаружил, что существует патч, который, вероятно, отвечает за новое поведение:
RSS-698: попробуйте поймать наконец ошибку под win64x
К сожалению, не могу войти там.
Мне хотелось бы узнать больше о причине этого сообщения об ошибке. Если патч действительно виноват в этом, мне интересно, не создает ли патч больше ошибок, чем исправляет.

ОБНОВЛЕНИЕ: >
Спасибо за ваши предложения по решению проблемы. Но, чтобы мой вопрос был кратким, я недостаточно объяснил его суть.
Пример кода является результатом автоматического преобразования следующего кода Delphi с помощью инструмента Delphi2CB:

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

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;
Это преобразование несложное и понятно каждому пользователю.
Пример кода был взят из C++-версии компонентов SynEdit, где ошибка теперь возникает часто. Построение специальной структуры для этого случая не будет решением для других случаев. Использованиеscope_exit было бы общим решением, но не интуитивно понятным.
И, как я сказал вначале, несколько недель назад этой проблемы не существовало. Я не понимаю, почему код вдруг перестал работать.

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

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

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

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

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

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