Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.16;
Скачать: CL | DM;

Вниз

Видимость переменных   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
1-50816
Goph
2002-09-04 00:51
2002.09.16
Вопрос о удаление


1-50818
Dmk
2002-08-24 12:50
2002.09.16
Схема передачи сообщений в VCL компоненте


1-50790
jcrush
2002-09-02 18:19
2002.09.16
код из Help a а глючит до нельзя :( может где нить ошибка???


1-50723
BT
2002-09-05 13:26
2002.09.16
Published and Variant


3-50649
agrig
2002-08-26 16:10
2002.09.16
Как установить LANGDRIVER для драйвера PARADOX программно?