Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-50796
MaximatorVeter
2002-09-03 15:01
2002.09.16
Не могу разобраться как работает метод Assign


3-50619
Igoryan
2002-08-26 17:40
2002.09.16
Работа С ODBC


1-50773
Micah'GF
2002-08-31 22:39
2002.09.16
Как изменить размер формы?


1-50680
nimble
2002-09-05 05:51
2002.09.16
Pointer&Dynamic Array


7-51005
Чайник2
2002-07-04 06:42
2002.09.16
Click





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский