Войти
ДельфинарийФорум

...

#0
10:42, 14 авг. 2009

есть функция

 printf(logHint, msgNewClass + ClassName ); // THIS!!! not work
 printf(logHint,  ClassName ); // THIS!!! work !!!
которая при выходе создаст ошибку, только при случаи если она будет испл, в длл.
вот:
в editor.exe, точно такая же функция в input.dil.

// CObject::Create
constructor CObject.Create(const inParent: CObject);
const msgNewClass = ' new class: ';
begin
// init child(s) list
 fChilds:= list.create(0, SizeOf(CObject));
 Parent:= inParent;
 if (Parent <> nil) then
 fNotifer:= fParent.notifier;
 if fNotifer = nil then // if Notifer first class create then main class
 fNotifer:= Self;
// write to log
 printf(logHint, msgNewClass + ClassName ); // THIS!!!
end;


asm генерит editor.exe

cls.pas.81: printf(logHint, msgNewClass + ClassName );
00404D6F A0F44D4000       mov al,[$00404df4]
00404D74 50               push eax
00404D75 8D95ECFEFFFF     lea edx,[ebp-$00000114]
00404D7B 8B45FC           mov eax,[ebp-$04]
00404D7E 8B00             mov eax,[eax]
00404D80 E8A7E2FFFF       call TObject.ClassName
00404D85 8D95ECFEFFFF     lea edx,[ebp-$00000114]
00404D8B 8D45EC           lea eax,[ebp-$14]
00404D8E E829EEFFFF       call @LStrFromString
00404D93 8B4DEC           mov ecx,[ebp-$14]
00404D96 8D45F0           lea eax,[ebp-$10]
00404D99 BA004E4000       mov edx,$00404e00
00404D9E E889EEFFFF       call @LStrCat3
00404DA3 8B4DF0           mov ecx,[ebp-$10]
00404DA6 B202             mov dl,$02
00404DA8 8B45FC           mov eax,[ebp-$04]
00404DAB 8B18             mov ebx,[eax]
00404DAD FF13             call dword ptr [ebx]

asm генерит input.dil

cls.pas.81: printf(logHint, msgNewClass + ClassName );
001A4C97 A01C4D1A00       mov al,[$001a4d1c]
001A4C9C 50               push eax
001A4C9D 8D95ECFEFFFF     lea edx,[ebp-$00000114]
001A4CA3 8B45FC           mov eax,[ebp-$04]
001A4CA6 8B00             mov eax,[eax]
001A4CA8 E873E3FFFF       call $001a3020
001A4CAD 8D95ECFEFFFF     lea edx,[ebp-$00000114]
001A4CB3 8D45EC           lea eax,[ebp-$14]
001A4CB6 E84DEFFFFF       call $001a3c08
001A4CBB 8B4DEC           mov ecx,[ebp-$14]
001A4CBE 8D45F0           lea eax,[ebp-$10]
001A4CC1 BA284D1A00       mov edx,$001a4d28
001A4CC6 E895EFFFFF       call $001a3c60
001A4CCB 8B4DF0           mov ecx,[ebp-$10]
001A4CCE B202             mov dl,$02
001A4CD0 8B45FC           mov eax,[ebp-$04]
001A4CD3 8B18             mov ebx,[eax]
001A4CD5 FF13             call dword ptr [ebx]

Можете объяснить этот дефект(Эффект) почему?
svn: http://code.google.com/p/iray/source/browse/#svn/sdk3a


#1
14:13, 16 авг. 2009

ReeV
svn не качал, в асм не вникал, но вот на первый взгляд это

printf(logHint, msgNewClass + ClassName ); // THIS!!! not work
и это
printf(logHint,  ClassName ); // THIS!!! work !!!

отличаются тем, что во втором случае в функцию передается статический указатель на строку, а в первом агрегатная строка генерируется на ходу, и видимо либо не в той области памяти, либо удаляется раньше времени.

Попробуй завести отдельную переменную.

#2
22:59, 16 авг. 2009

DROnik
Там получается бред, да что-то тут не то, хитрый компилятор.. мдя

было так( не работало ):

constructor CObject.Create(const inParent: CObject);
const msgNewClass = ' new class: ';
begin
// init child(s) list
 fChilds:= list.create(0, SizeOf(CObject));
 Parent:= inParent;
 if (Parent <> nil) then
 fNotifer:= fParent.notifier;
 if fNotifer = nil then // if Notifer first class create then main class
 fNotifer:= Self;
// write to log
 printf(logHint, msgNewClass + ClassName ); // THIS!!!
end;

вынес вызов парент из функции создания
стало все отлично.
конечно это твик, но все же хотелось узнать почему такая жопа.

// CObject::Create
procedure CObject.AfterConstruction;
var
 nParent: CObject;
begin
  inherited;
 nParent:= fParent;
 fParent:= nil;
 parent:= nParent;
end;

кст если закоментить присвоение парента

 Parent:= inParent;
а делать так
 inNotifier.addChild( CInputApi.create( inNotifier ) );
безобидный код парента 
// CObject::setParent
procedure CObject.setParent(const value: CObject);
begin
// check cmp value if usaly set
 if (value = fParent) then exit;
// check parent valid if yes then del self of parent
 if (fParent <> nil) and (fParent <> Value) then value.dropChild(fParent);
// set variable
 fParent:= value;
 // add to parent
 fParent.addChild(Self);
end;

p.s Сори не стой учетки залогинился)))

#3
9:36, 17 авг. 2009

так где ошибка-то возникает в итоге?

>вынес вызов парент из функции создания
fParent - функция? это член класса или как?

#4
10:39, 17 авг. 2009

DROnik
Ошибка, возникает потом в операторе New который вызывается из длл.
стукни в аську 349-955-614, подробно обсудим.

#5
20:07, 19 авг. 2009

А если sharedMM использовать возникает ошибка? Или как он там зовется... Ну, чтоб память распределялась одним менеджером и в dll коде и в основном модуле.

#6
13:24, 21 авг. 2009

Mirage
Нет, проблемы когда испл. шаред мем, но мне его испл не нужно.

#7
21:23, 21 авг. 2009

А если по-русски?

ДельфинарийФорум

Тема в архиве.

Тема закрыта.