Piszę dość duży program i nadziałem się na problem, którego nie mogę przeskoczyć. Program ma działać na kompie 1, podłączonym przez port drukarki do specyficznego hardware'u, piszę go na kompie 2, na kórym jest Delphi 2005.
Problem polega na tym, że po pewnych (koniecznychi dużych) zmianach program zaczął sie wywalać na kompie 1, ale nie na kompie 2. Przy czym na kompie 2 nie wywala się zarówno uruchamiany z IDE, jak i bezposrednio. Na 1, oczywiscie, był startowany tylko bezpośrednio, bo nie mam tam Delphi.
W czasie uruchomień testowych na kompie 2 hardware jest emulowany wewnętrznie. Więc od paru dni szukałem bezskutecznie tym tropem - że emulacja różni się od rzeczywistości. Mimo, że jest zrobiona jak najbliżej hardwaru i dane emulowane przechodzą większość ścieżki danych rzeczywistych. Wreszcie dzis się zezłościłem, przyniosłem komp2 do hardwaru, podpiąłem, i okazało sie, że się nie wywala. Czyli problem jest specyficzny dla kompa1.
Komp1 ma WinXP SP1 i nie ma .net, komp2 ma SP2 i .net. No ale program oczywiście jest napisany jako aplikacja Win32, i nie robi jakichs rzeczy typu bo ja wiem łączenie z netem, które SP2 mógłby blokować.
Fragment kodu, gdzie pada:
procedure {nested}
PlotLine(Display:TSpikeDisplay; CurLine:Integer; MFWidth:Integer);
var
i,j,xpos,ypos:integer;
RewardStartPos, ResponseStartPos:integer;
PLCanvas:array[0..1]of TCanvas;
begin
{ line structure
@0 spike (to SpikeHeight-1), black
@SpikeHeight Response (1) red
@SpikeHeight+1 Reward (1) aqua
@SpikeHeight+2 Separator line(1) silver
[@SpikeHeight+3 empty (margin) line (1) not drawn}
MemoSession.Lines.Add(
'### 1' ) ;
Application.ProcessMessages;
PLCanvas[0]:=Display.MetaFileCanvas;
PLCanvas[1]:=Display.Bitmap.Canvas;
MemoSession.Lines.Add(
'### 2' ) ;
Application.ProcessMessages;
RewardStartPos:=1;
ResponseStartPos:=1;
ypos:=Margin+2*LineHeight+1+CurLine*TraceHeight;
MemoSession.Lines.Add(
'### 3' ) ;
Application.ProcessMessages;
for i:=0 to 1 do
begin
PLCanvas[i].Pen.Color:=clSilver;
PLCanvas[i].PenPos:=Point(0,ypos+SpikeHeight+2);
PLCanvas[i].LineTo(MFWidth,ypos+SpikeHeight+2);
MemoSession.Lines.Add(
'### 4' ) ;
Application.ProcessMessages;
end;
Linijki z MemoSession służą oczywiście znalezieniu miejsca błędu.
Wywala się z Access violation po wyświetleniu '### 3' ale przed którymkolwiek '### 4'.
Czy ktoś ma pomysł o co może chodzić? Czy jest tu jakiś kod wymagający SP2 lub .net???
Aha, zainstalowanie SP2 i/lub .net na kompie 1 byłoby uciązliwe, ponieważ jest on oddalony od łącza internetowego. Ale oczywiście mogę się postarać, tylko czy warto?