Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запускаем Dokan на C++ Builder

75K
13 октября 2011 года
260db
2 / / 12.10.2011
Здравствуйте!
Я начинающий в с++,до этого писал на vb.net, сейчас потихоньку привыкаю к новому синтаксису :)
[SIZE="1"]для тех кто не в курсе, Dokan - это драйвер виртуальной файловой системы, который крутится в kernel-mode и транслирует все запросы системы в user-mode. Вот ссылка на домашнюю страницу проекта
[/SIZE]Давно пытаюсь подружиться с этим драйвером т.к. для моей идеи лучшего не найти, сначала были попытки работать с ним на vb.net(у этого драйвера есть "обертка" для .net), но дальше создания/удаления директорий дело не дошло. Точно не помню из-за чего, но вроде бы из-за сложности синхронизации потоков.

Недавно опять вспомнил по него, уже пересевши на с++ builder, после 15-ти часового перенапряжения мозга, все-таки удалось прикрутить Dokan к проекту на билдере которое проводило его инициализацию. Потом, немного помучившись, прикрутил все callback функции, с помощью которых собсно и попадают все запросы из виртуального жесткого диска в мое приложение.
Далее написал небольшой класс для хранения структуры ФС и начал прикручивать новоиспеченный класс к моему проекту и столкнулся с проблемой.
Чтобы не заваливать сообщение километровыми листингами набросал небольшой пример, отражающий суть проблемы:

Код:
Class DokanOperations
{
Public:
    FS *FSRoot; // тут я создаю ссылку на собственно написанный класс для хранения структуры ФС

    Static int __stdcall FindFiles(int a, int b); // это наша callback функция

    DokanOperations();
    ~ DokanOperations();
};

DokanOperations::DokanOperations()
{
    FSRoot = new FS(“Root”);
};

~DokanOperations::DokanOperations()
{
    Delete FSRoot;
};

Static int __stdcall DokanOperations::FindFiles(int a, int b)
{

… // тут какой то код…


FSRoot->FindFiles(int c);   // а вот тут мне нужно обратиться к функции моего класса, но компилятор мне показывает фигу... пишет
                // E2231 Member cannot be used without an object
};


После получасового гугления и экспериментов, нашел описание проблемы и возможные "костыли" решающие ее, но так и не смог прикрутить их к своему проекту.
Тут я начал понимать, что дальше дело пойдет туго т.к. функция инициализации Dokan’а выполняется в другом потоке(иначе все виснет намертво), а это уже большие ограничения по коду, т.к. на прямую с основным потоком работать нельзя, только через “костыли”, так теперь еще и тут мне запрещают работать с моим классом из статической функции… получается у меня совсем руки связаны!
Поэтому я сделал вывод, что неправильно выбрал структуру проекта, помогите “нарисовать” правильный каркас проекта.
Суть проекта состоит в том, чтобы создать виртуальный жесткий диск, который просто хранит всю структуру файловой системы и сами данные файлов в памяти.

Прикрепляю файл проекта(создан в Embarcadero C++ Builder 2010):
http://fulllink.ru/dokan_builder.7z 10,9Kb

Небольшие пояснения в проекте:
FileSystem.cpp/.h
Класс FS - для сохранения структуры файлов/каталогов на основе двух-связных списков
Класс Item - для хранения единичного элемента(файла/каталога), используется в классе FS

ClassDokanOperations.cpp/.h
Класс ClassDokanOperations - основной класс для связывания моего класса FS, с функциями dokan'а, при создании создает экземпляр класса FS и содержит все callback функции dokan'а.

Thread.cpp/.h
Класс THREAD - запускает инициализацию виртуального диска, создает экземпляр класса ClassDokanOperations и прикручивает все callback функции содержащиеся в нем.

main.cpp/.h
нет ничего интересного, просто при запуске приложения создает и запускает поток THREAD
277
13 октября 2011 года
arrjj
1.7K / / 26.01.2011
В static не могут быть использованы не-static члены/методы класса.
75K
13 октября 2011 года
260db
2 / / 12.10.2011
Из-за того что функция callback её приходиться делать static, но как тогда обращаться из нее к не-static объекту? В первом посте есть ссылка на возможное решение проблемы, суть заключается в том, чтобы объявить static указатель, в конструкторе присвоить ему текущий класс и уже в static функции обращаться через него. Вот примерно как это будет выглядеть:
Код:
class DokanOperations
{
Public:
    FS *FSRoot;
    static DokanOperations *pThis; // Создаю static указатель на этот класс

    static int __stdcall FindFiles(int a, int b); // это наша callback функция

    DokanOperations();
    ~ DokanOperations();
};

DokanOperations::DokanOperations()
{
    FSRoot = new FS(“Root”);
    DokanOperations::pThis = this; // инициализирую его
};

~DokanOperations::DokanOperations()
{
    Delete FSRoot;
};

int __stdcall DokanOperations::FindFiles(int a, int b)
{

… // тут какой то код…


pThis->FSRoot->FindFiles(int c);
};


Пробовал так сделать, но линкер не может найти этот static указатель, пишет:
[ILINK32 Error] Error: Unresolved external 'ClassDokanOperations:: pThis' referenced from C:\DOKAN_BUILDER\DEBUG\CLASSDOKANOPERATIONS.OBJ
[ILINK32 Error] Error: Unable to perform link
14
14 октября 2011 года
Phodopus
3.3K / / 19.06.2008
Какова сигнатура callback ф-ии? (проект пока не смотрел)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог