![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Видимость переменных [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]Скомпилял твой код - все нормально, без ругательств.
Переменная видна.
Видимо, ошибка не в этом.
Какое сообщение выдается?