• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Сообщения из Dll

  • Автор темы Автор темы ApocalipsisNN
  • Дата начала Дата начала
A

ApocalipsisNN

Суть проблемы - есть Dll написанная в VS 2005 C++. В ней содержится математический движок рассчета. Интерфейс основной программы написан на Delphi. Математический движок тестирует значения приходящие из Delphi и, если есть ошибки, должен вернуть или код ошибки или сам текст ошибки(в принципе не важно) в Delphi. Как лучше всего построить этот механизм?
 
Результат функции в DLL - 0 если выполнение успешно, иначе код ошибки. Чем не подходит?
 
Чуть чуть не правильно объяснил, сорри! Суть вот в чем например есть функция такая вот:
EXPORT int __stdcall Control_Scheme(int i)
{

int CMsize=0;
int nv,tv,j,u,np,ng;
int *indV;
char ConvBuf[11];
ConvBuf[10]='\0';
double Fsum,eps=1.e-8;
indV= new int[CC.NP];
TSK->LetContinue=true;
nv = 0;
for(u=0; u< CC.NP; u++)
{
tv = 0;
for(j=0; j< CC.NG; j++)
{
if(CC.SS[2*j+0] == u) tv++;
if(CC.SS[2*j+1] == u) tv++;
}
if(tv == 1)
{
indV[nv] = u;
nv++;
}
}
if(nv == 0)
{
Fsum = 0.0;
for(j=0; j< CC.NQ; j++)
Fsum += CC.zQ[j];
if(fabs(Fsum) > eps)
{
// fprintf(pfp,"ФАТАЛЬНАЯ ОШИБКА: SUMMA(Q%d)#0\n",i);
CMsize++;
TSK->CM.resize(CMsize);
//_ltoa_s(i,ConvBuf,11,10);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+"ФАТАЛЬНАЯ ОШИБКА: SUMMA(Q)#0";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
if(CC.NIP > 1)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+"ФАТАЛЬНАЯ ОШИБКА: NPfix>1";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
if(CC.NJZ > 1)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+"ФАТАЛЬНАЯ ОШИБКА: NJfix>1";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
Fsum = 0.0;
for(j=0; j< CC.NIG; j++)
Fsum += CC.zG[j];
if(fabs(Fsum) > eps)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+"ФАТАЛЬНАЯ ОШИБКА: NGist#0";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
}
else
{
np = ng = 0;
for(u=0; u< nv; u++)
{
tv = 1;
for(j=0; j<CC.NIP; j++)
if(indV == CC.iP[j])
{
tv = 0;
np++;
}
for(j=0; j<CC.NIG; j++)
if(indV == CC.iG[j])
{
tv = 0;
ng++;
}
if(tv)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+", "+TSK->NodeStr;
_ltoa(indV,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->CM[TSK->CM.size()-1].Message+ConvBuf +": не заданы фиксированное давление или источник расхода";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
}
if(np == 0)
{
Fsum = 0.0;
for(j=0; j< CC.NIG; j++) Fsum += CC.zG[j];
if(fabs(Fsum) > eps)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+": ПРЕДУПРЕЖДЕНИЕ: SUMMA(Gi)#0";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
}
if(np>0 && CC.NIP > np)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+" ФАТАЛЬНАЯ ОШИБКА: переопределено число заданных давлений в узлах";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
for(u=0; u< nv; u++)
{
tv = 0;
for(j=0; j<CC.NIP; j++)
if(indV == CC.iP[j]) tv++;
for(j=0; j<CC.NIG; j++)
if(indV == CC.iG[j]) tv++;
if(tv > 1)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+", "+TSK->NodeStr;
_ltoa(indV,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->CM[TSK->CM.size()-1].Message+ConvBuf +" ФАТАЛЬНАЯ ОШИБКА: одновременно заданы два граничных условия";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
}
if(nv==1)
{
Fsum = 0.0;
for(j=0; j< CC.NQ; j++)
Fsum += CC.zQ[j];
if(fabs(Fsum) > eps)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+" ФАТАЛЬНАЯ ОШИБКА: обнаружен не баланс источников (стоков) тепла";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
}
}
delete[] indV;

if(TSK->CM.size()>0) TSK->LetContinue=false;//предупреждния есть
return TSK->LetContinue;
}

-----------------------------------------------------------------------------------------------------------------------------------
Т.е ошибок чисто теоретически даже в этой функции может быть несколько. Я хочу чтобы, как только решатель обнаружил ошибку, то он сразу сообщил о ней в Dll... Вот вопрос в том какой механизм выбрать... Точнее как грамотнее всего реализовать его!
 
Я хочу чтобы, как только решатель обнаружил ошибку, то он сразу сообщил о ней в Dll... Вот вопрос в том какой механизм выбрать... Точнее как грамотнее всего реализовать его!
"return код_ошибки" в месте где возникла ошибка с подчисткой ресурсов
 
в таком случае, возможно стоит прибегнуть к самому нелюбимому мной оператору goto. В месте, где возникла ошибка, goto - в конец функции, где происходит освобождение памяти, ресурсов, затем return
 
Dimmuborgir уж лучше с помощью эксептиона.
 
Спасибо всем ответившим, но уже нашел выход... Написал callback функцию, которая в момент возникновения ошибки вызывает функцию из Delphi и передает код ошибки. Там эти ошибки и отображаются...
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab