O código de terceiros está modificando a palavra de controle da FPU

A introdução - a parte longa e chata

(A questão está no final)

Estou com dores de cabeça severas em relação a um componente COM de terceiros que continua alterando a palavra de controle da FP

Meu ambiente de desenvolvimento é Windows e Visual C ++ 2008. A palavra de controle normal da FPU especifica que nenhuma exceção deve ser lançada durante várias condições. Eu verifiquei isso com os dois olhando para o_CW_DEFAULT macro encontrada emfloat.h, além de observar a palavra de controle no depurador na inicializaçã

Sempre que faço uma chamada para o objeto COM, a palavra de controle é modificada ao retornar. Isso é fácil de defender. Simplesmente redefino a palavra controle e tudo está bem. O problema é quando o componente COM começa a chamar meu coletor de eventos. Posso proteger meu código redefinindo a palavra de controle assim que receber a chamada de evento, mas não posso fazer nada assim que retornar da chamada de evento.

Não tenho a fonte deste componente COM, mas estou em contato com o autor. As respostas que tive dele foram "Huh?". Não acho que ele tenha a menor idéia do que estou falando, então temo ter que fazer algo sobre isso sozinho. Eu acredito que o tempo de execução dele (acho que é Delphi ou Borland C ++, porque a DLL está cheia de nomes de símbolos, todos começando com T maiúsculo) ou algum outro código de terceiros que ele está usando, que está causando o problema. Não acho que o código dele modifique explicitamente a palavra de controle da FP

Então o que eu posso fazer? Do ponto de vista comercial, é imperativo usar esse componente de terceiros. Do ponto de vista técnico, eu poderia abandoná-lo e implementar o protocolo da comunicação. No entanto, isso seria muito caro, pois esse protocolo envolve o processamento de transações com cartão de crédito. Não queremos assumir a responsabilidade.

Preciso desesperadamente de um hack-around ou de algumas informações úteis sobre as configurações de FPU nos produtos Borland que eu possa transmitir ao autor do component

As questõe

Há alguma coisaI pode fazer? Não acho que o autor do componente tenha o que é necessário para corrigi-lo (a julgar por suas respostas um tanto sem noção

Estou brincando com a idéia de instalar meu próprio manipulador de exceções, no qual redefini a palavra de controle no manipulador e digo ao Windows para continuar executando. Tentei instalar o manipulador comSetUnhandledExceptionFilter(), mas por algum motivo, as exceções não são capturadas.

Por que não estou capturando as exceções?Se eu conseguir capturar exceções da FPU, redefinir a palavra de controle da FPU e deixar a execução continuar como nada aconteceu - todas as apostas estão desativadaAtualiza

Gostaria de agradecer a todos por suas sugestões. Enviei ao autor instruções sobre o que ele pode fazer para facilitar a vida não apenas para mim, mas para muitos outros clientes de seu código. Sugeri a ele que ele provasse a palavra de controle da FPU emDllMain(DLL_PROCESS_ATTACH) e salve a palavra de controle para mais tarde, para que ele possa redefinir o FPU CW antes de chamar meus manipuladores de eventos e retornar das minhas chamada

Por enquanto, eu tenho um hack-around, se alguém estiver interessado. O hack-around é potencialmente ruim, porque não sei o que fará comdel código. Recebi confirmação anteriormente de que ele não usa números de ponto flutuante em seu código, portanto, isso deve ser seguro, exceto por código de terceiros que ele usa, que depende de exceções de FPU.

As duas modificações que fiz no meu aplicativo:

Embrulhe minha bomba de mensagens Instale um gancho de janela WH_CALLWNDPROC) para capturar os casos de canto em que a bomba de mensagens é ignorada

Nos dois casos, verifico se o FPU CW mudou. Se tiver, redefino-o para_CW_DEFAULT.

questionAnswers(2)

yourAnswerToTheQuestion