cdecl - как это работает и для чего это?
Добавлено: 23.03.2013 22:12:33
Есть примерно вот такой код:
TReadCallback = procedure(Chunk: TChunkRec; Data: Pointer); cdecl;
Если я правильно понял, то cdecl - каким-то хитрым образом перемещает данные справа налево в смысле заполняет через стек левую переменную.
Справа Data: Pointer... и он априори пустой... слева Chunk и он read из Stream... (в смысле я не понимаю как это работает даже прочитав статью). http://ru.wikipedia.org/wiki/%D1%EE%E3%EB%E0%F8%E5%ED%E8%E5_%E2%FB%E7%EE%E2%E0. Как он передает справа налево, если справа пусто?
Однако именно в этом месте падает "чужой" модуль, а мне хочется(нужно) этот модуль оживить. Я попробовал заменить cdecl на pascal; но модуль всё равно падает именно в этом месте... И я не понимаю что именно делает cdecl?
запускается TReadCallback из вот такой функции.
LoadFromStream(Stream: TStream; ReadCallback: TReadCallback; UserData: Pointer): LongWord;
в теле, которой после резервирования памяти и строчки:
Stream.Read(Chunk.data^,Chunk.size); // где Chunk: TChunkRec;
вызывается TReadCallback; // который TReadCallback = procedure(Chunk: TChunkRec; Data: Pointer); cdecl; и тут модуль валится...
Вот... надеюсь изложил понятно...
Объясните пожалуйста, доступным языком, что делает cdecl; ?
Или как можно заменить cdecl; которая объявлена как TReadCallback = procedure(Chunk: TChunkRec; Data: Pointer); cdecl;?
.
TReadCallback = procedure(Chunk: TChunkRec; Data: Pointer); cdecl;
Если я правильно понял, то cdecl - каким-то хитрым образом перемещает данные справа налево в смысле заполняет через стек левую переменную.
Справа Data: Pointer... и он априори пустой... слева Chunk и он read из Stream... (в смысле я не понимаю как это работает даже прочитав статью). http://ru.wikipedia.org/wiki/%D1%EE%E3%EB%E0%F8%E5%ED%E8%E5_%E2%FB%E7%EE%E2%E0. Как он передает справа налево, если справа пусто?
Однако именно в этом месте падает "чужой" модуль, а мне хочется(нужно) этот модуль оживить. Я попробовал заменить cdecl на pascal; но модуль всё равно падает именно в этом месте... И я не понимаю что именно делает cdecl?
запускается TReadCallback из вот такой функции.
LoadFromStream(Stream: TStream; ReadCallback: TReadCallback; UserData: Pointer): LongWord;
в теле, которой после резервирования памяти и строчки:
Stream.Read(Chunk.data^,Chunk.size); // где Chunk: TChunkRec;
вызывается TReadCallback; // который TReadCallback = procedure(Chunk: TChunkRec; Data: Pointer); cdecl; и тут модуль валится...
Вот... надеюсь изложил понятно...
Объясните пожалуйста, доступным языком, что делает cdecl; ?
Или как можно заменить cdecl; которая объявлена как TReadCallback = procedure(Chunk: TChunkRec; Data: Pointer); cdecl;?
.