Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Видимость переменных [D6, Win2k, WinXP]


Borys ©   (2002-09-02 19:07:00) 

Как сделать чтобы функция CALLBACKFUNC увидела переменную pFileOut?


function TMP3GOGO.codec(strFileIn,strFileOut: String; sleeping: integer=0; mbitrate: short = 64; mmpeg: byte = 1): integer;
var
pFileOut: Cardinal;

function CALLBACKFUNC(var Buf; nLength: DWORD ):MERET; cdecl;
var
i: DWORD;
begin
if (nLength>0) then begin
WriteFile(pFileOut,Buf,nLength,i,nil);
end;
if nLength=i then Result:=ME_NOERR
else Result:=i;
end;

begin
....
end;


Borys   (2002-09-03 12:00:00) [1]

Так вот способ придумать добраться до объекта я и не могу придумать.


PVOzerski   (2002-09-03 11:15:00) [2]

Опыт показывает: передавать как Callback удается только функции, не вложенные в другие (думаю, дело связано с тем, что вложенным функциям доступны локальные переменные функции-"хозяина" - см. Dimk (03.09.02 10:52).
>Внутрення потомучто объектов данного класса м.б. много и
>объявлять переменную после implementation не годиться объявлять
>эту фуенцию в классе тоже не годится т.к. получаются бредовые
>значения переменных.
>Т.е. работают паралельно несколько процессов и у каждого свой
>дескриптор файла куда писать.
>В dll я передаю адресс функции.

И как только "сишники" без вложенных функций обходятся? :^) Ну что Вам мешает из любого экземпляра класса обратиться к неинкапсулированной функции? А способов добраться из callback"а до соответствующего объекта можно придумать много.




Dimk   (2002-09-03 10:52:00) [3]

Borys! Тут такая тонкость:
pFileOut - переменная которая создается в стековом фрейме процедуры TMP3GOGO.codec.
CALLBACKFUNC внутренняя функция ( в C нет такого понятия ) для TMP3GOGO.codec и чтобы она (CALLBACKFUNC) могла юзать переменные из стека TMP3GOGO.codec ей (CALLBACKFUNC) дополнительно передается указатель на стековый фрейм TMP3GOGO.codec в качестве дополнительного параметра (он такойже неявный как и Self). Если же ее вызвать CALLBACKFUNC извне обычным образом - то ты не сможешь корректно передать указатель на стековый фрейм TMP3GOGO.codec и в конечном счете она (CALLBACKFUNC) вместо pFileOut обращается не туда.


Borys   (2002-09-03 10:28:00) [4]

Внутрення потомучто объектов данного класса м.б. много и объявлять переменную после implementation не годиться объявлять эту фуенцию в классе тоже не годится т.к. получаются бредовые значения переменных.
Т.е. работают паралельно несколько процессов и у каждого свой дескриптор файла куда писать.
В dll я передаю адресс функции.


MBo   (2002-09-03 10:06:00) [5]

Ну так почему же она внутренняя????


Borys   (2002-09-03 10:04:00) [6]

Ошибок не дает но дает исключительную ситуацию, типа обращения к памяти по адресу 0000002 ..., в том то и весь кампот что cdecl обязательно это функция вызывается из dll. В дебугере говорит что данная переменная не доступна.


Юрий Зотов   (2002-09-03 01:00:00) [7]

Переменная, конечно, будет видна. Видимо, дело не в этом. Настораживает cdecl и то, что callback - внутренний.


pasha_golub   (2002-09-02 20:39:00) [8]

Переменная будет видна, однозначно!!


vlv   (2002-09-02 19:36:00) [9]

Скомпилял твой код - все нормально, без ругательств.
Переменная видна.
Видимо, ошибка не в этом.
Какое сообщение выдается?


Наверх

Титульная страница Поиск, карта сайта Написать письмо