OVH Cloud OVH Cloud

Erreur : Il y a eu un dépassement de capacité positif ou négatif

1 réponse
Avatar
vain20_2020
Bonjour,

j'ai créé une assembly contenant une Windows.Form.

Or a chaque foit que j'exécute mon assembly j'obtient cette erreur :

Erreur : Il y a eu un dépassement de capacité positif ou
négatif dans l'opération arithmétique.

Il s'agit de l'exception System.ArithmeticException
déclenché dans la méthode System.Drawing.Font.Initialize().

D'après un autre post ce problème viendrait : "d'un problème de
registre processeur dut à l'installation d'une application tiers."

connaissez vous une solution pour résoudre ce problème en VB.NET ?

Je suis novice et je galère pour résoudre cette exception

merci d'avance

1 réponse

Avatar
Julien Bakmezdjian [MS]
Bonjour,

Effectivement, ce problème vient d'un logiciel tiers (un driver surement,
j'ai souvent vu le cas avec des modems ou des drivers OLEDB) qui positionne
certains flags du processeur, sans les remettre à leur position d'origine.
Hors, certaines classes de la FCL partent du principe que ces flags sont
bien dans leur position d'origine (pour être plus précis, il s'agit des
flags FPU : http://www.intel.com/design/pentiumii/manuals/24319002.PDF,
section 7.3.4).

Pour résoudre le problème, il faut créer une DLL (FPUExceptions.dll) en C++
avec ce code :

-------------------------------------------------FPUExceptions.cpp
// FPUExceptions.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "FPUExceptions.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

extern "C" __declspec(dllexport) WORD WINAPI fnFPUExceptions( BOOL bTurnOn )
{
WORD wTemp, wSave;
__asm fstcw wSave
wTemp = wSave;
if( bTurnOn )
wSave |= 0x3f;
else
wSave &= 0xFFC0;
__asm fldcw wSave
return wTemp;
}



-------------------------------------------------FPUExceptions.h
// FPUExceptions.h :
#ifdef FPUEXCEPTIONS_EXPORTS
#define FPUEXCEPTIONS_API __declspec(dllexport)
#else
#define FPUEXCEPTIONS_API __declspec(dllimport)
#endif

extern "C" FPUEXCEPTIONS_API WORD WINAPI fnFPUExceptions(BOOL
bTurnExceptionsOn);


Ensuite, dans l'application VB.NET elle-même, vous devez placer ces quelques
lignes de code pour déclarer la fonction externe :

Public Class Form1

Inherits System.Windows.Forms.Form



<System.Runtime.InteropServices.DllImport("FPUExceptions.dll")> _

Public Overloads Shared Function fnFPUExceptions(ByVal bTurnOn As Int32)
_

As Int32

End Function

'. . .

Enfin, il faut appeler cette fonction avant l'appel à la Font (dans le
OnLoad de la Form par exemple), comme ceci :

Call fnFPUExceptions(1)

Cordialement,

Julien

"Vince" a écrit dans le message de
news:
Bonjour,

j'ai créé une assembly contenant une Windows.Form.

Or a chaque foit que j'exécute mon assembly j'obtient cette erreur :

Erreur : Il y a eu un dépassement de capacité positif ou
négatif dans l'opération arithmétique.

Il s'agit de l'exception System.ArithmeticException
déclenché dans la méthode System.Drawing.Font.Initialize().

D'après un autre post ce problème viendrait : "d'un problème de
registre processeur dut à l'installation d'une application tiers."

connaissez vous une solution pour résoudre ce problème en VB.NET ?

Je suis novice et je galère pour résoudre cette exception

merci d'avance