Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];
ВнизВидимость переменных Найти похожие ветки
← →
Borys (2002-09-02 19:07) [0]Как сделать чтобы функция 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;
← →
vlv (2002-09-02 19:36) [1]Скомпилял твой код - все нормально, без ругательств.
Переменная видна.
Видимо, ошибка не в этом.
Какое сообщение выдается?
← →
pasha_golub (2002-09-02 20:39) [2]Переменная будет видна, однозначно!!
← →
Юрий Зотов (2002-09-03 01:00) [3]Переменная, конечно, будет видна. Видимо, дело не в этом. Настораживает cdecl и то, что callback - внутренний.
← →
Borys (2002-09-03 10:04) [4]Ошибок не дает но дает исключительную ситуацию, типа обращения к памяти по адресу 0000002 ..., в том то и весь кампот что cdecl обязательно это функция вызывается из dll. В дебугере говорит что данная переменная не доступна.
← →
MBo (2002-09-03 10:06) [5]Ну так почему же она внутренняя????
← →
Borys (2002-09-03 10:28) [6]Внутрення потомучто объектов данного класса м.б. много и объявлять переменную после implementation не годиться объявлять эту фуенцию в классе тоже не годится т.к. получаются бредовые значения переменных.
Т.е. работают паралельно несколько процессов и у каждого свой дескриптор файла куда писать.
В dll я передаю адресс функции.
← →
Dimk (2002-09-03 10:52) [7]Borys! Тут такая тонкость:
pFileOut - переменная которая создается в стековом фрейме процедуры TMP3GOGO.codec.
CALLBACKFUNC внутренняя функция ( в C нет такого понятия ) для TMP3GOGO.codec и чтобы она (CALLBACKFUNC) могла юзать переменные из стека TMP3GOGO.codec ей (CALLBACKFUNC) дополнительно передается указатель на стековый фрейм TMP3GOGO.codec в качестве дополнительного параметра (он такойже неявный как и Self). Если же ее вызвать CALLBACKFUNC извне обычным образом - то ты не сможешь корректно передать указатель на стековый фрейм TMP3GOGO.codec и в конечном счете она (CALLBACKFUNC) вместо pFileOut обращается не туда.
← →
PVOzerski (2002-09-03 11:15) [8]Опыт показывает: передавать как Callback удается только функции, не вложенные в другие (думаю, дело связано с тем, что вложенным функциям доступны локальные переменные функции-"хозяина" - см. Dimk (03.09.02 10:52).
>Внутрення потомучто объектов данного класса м.б. много и
>объявлять переменную после implementation не годиться объявлять
>эту фуенцию в классе тоже не годится т.к. получаются бредовые
>значения переменных.
>Т.е. работают паралельно несколько процессов и у каждого свой
>дескриптор файла куда писать.
>В dll я передаю адресс функции.
И как только "сишники" без вложенных функций обходятся? :^) Ну что Вам мешает из любого экземпляра класса обратиться к неинкапсулированной функции? А способов добраться из callback"а до соответствующего объекта можно придумать много.
← →
Borys (2002-09-03 12:00) [9]Так вот способ придумать добраться до объекта я и не могу придумать.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c