Avrei una domanda non tanto semplice (Delphi6):
Sto creando una DLL che ho già fatto in Assembly e C++, e non sono ancora soddisfatto, in quanto voglio intercettare gli errori runtime in modo sicuro.
Un esempio:
<pre id=code><font face=courier size= id=code>
function BNAdd(lpBNResult, lpBN1, lpBN2: PInteger; dwSize: Integer): Integer; stdcall;
var i: Integer;
begin
asm
pushad
mov edi,lpBNResult
mov esi,lpBN1
mov ebx,lpBN2
mov ecx,dwSize
and eax,eax
@L1:
dec ecx
js @L0
lodsd
adc eax,[ebx]
stosd
lea ebx,[ebx+4]
jmp @L1
@L0:
sbb eax,eax
mov i,eax
popad
end;
BNAdd := i;
end;
</font id=code></pre id=code>
Ora, seguendo il manuale, ed esempi, ho messo attorno
try
...
exception
...
end;
che funziona, se il codice è inglobato in un eseguibile, ma fallisce con un clamoroso GPF se è una DLL standalone. La stessa cosa succede anche con C++ e con Assembly. Comunque, con Delphi sono arrivato a un passo alla soluzione, perché con tutti gli handler attivati, mi appare occasionalmente una messagebox con un errore (NULL Pointer assignment, Page access violation) prima che va in crash. Ovviamente sbaglio qualcosa, ma non comprendo cosa esattamente.
Siccome la DLL contiene quasi esclusivamente codice Assembly, non posso usare metodi nativi di Delphi, ma sarei disposto a farlo, come ausilio, se fossi sicuro che poi mi trova gli errori, causati più che altro da NULL Pointer o dimensioni errate degli array Integer, che passo come Pointer.
Se uso la construct "array of", ho l'idea che non mi funziona più la DLL come desiderato, in quanto gli array lpBNx possono assumere una qualsiasi dimensione, fino all'esaurimento della memoria, e non devono essere copiati sullo stack, in quanto sono già in uno spazio globalmente accessibile, allocate dal programma chiamante.
dwSize indica la dimensione degli array, tutti della stessa dimensione, da 0 a infinito.
Secondo le tue esperienze, c'è una soluzione non troppo dolorosa per fare un trapping efficiente, o devo rinunciare?
Giovanni
---
http://www.y2ksw.com/vbulletin