Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
49 / 49 / 4
Регистрация: 21.05.2009
Сообщений: 156
1

C++ Builder + ASM

04.06.2009, 02:29. Показов 5796. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Можна сделать чтото такое:
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::Button1Click(TObject *Sender)
{ AnsiString s="C:\\1.txt";
   _asm{
lea eax,s
push eax
call DeleteFileA
        }
}
Эсли можно то подскажыте как... Понимаю что идиотизм, но задача состоит в том чтобы написать файловый менеджер. Интерфейс реализовать на C++ Builder, но для операции с файлами и каталогами использовать Ассемблерные вставки. Помогите пожалуйста. Очень нужно!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2009, 02:29
Ответы с готовыми решениями:

Builder C++ и asm вставки
У меня есть задание: даны 2 массива (двумерный и одномерный), нужно умножить из на разные множители...

Можно ли использовать C++ Builder v11 если купить Embarcadero C++Builder XE8
День добрый! Есть старый проект С++. Он компилируется на CodeGear™ C++Builder Version 11. Но на...

Как использовать компоненты скомпилированные для C++ Builder 2007 в C++ Builder 2010?
Народ! Такая проблема... Есть набор компонентов т.н. Dicom VCL. Сайт производителя -...

Как открыть проект C++Builder 6 в Embarcadero C++Builder 10.3 Community Edition?
Здравствуйте. Как открыть проект C++Builder 6 в новом Embarcadero C++Builder 10.3 Community Edition?

23
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
05.06.2009, 22:13 2
C++
1
2
3
4
5
6
7
8
9
10
    AnsiString str = "C:/1.txt";
    const char *a = str.c_str();
    int (__stdcall *p)(const char *); //указатель на функцию
    p = ::DeleteFileA;
 
    asm
    {
        push [a]
        call [p]
    }
1
49 / 49 / 4
Регистрация: 21.05.2009
Сообщений: 156
05.06.2009, 23:42  [ТС] 3
Спасибо
0
49 / 49 / 4
Регистрация: 21.05.2009
Сообщений: 156
07.06.2009, 16:49  [ТС] 4
Где Ошибка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void __fastcall TForm1::Button3Click(TObject *Sender)
{
         DWORD t1=GENERIC_READ|GENERIC_WRITE;
         DWORD t2=CREATE_NEW;
         DWORD th=FILE_SHARE_READ|FILE_SHARE_WRITE;
   Form3->ShowModal();
         DWORD t3=Form3->t3;
    Edit1->Text=t3;
 
   AnsiString Tsl=Drive1->Text[1];
   AnsiString str =Tsl+":\\"+K+Form3->Edit1->Text;
   Form2->Edit1->Clear();
        const char *a = str.c_str();
 
void * (__stdcall *p)(const char *,unsigned long,unsigned long,_SECURITY_ATTRIBUTES *,unsigned long,unsigned long,void *);
        p = ::CreateFile;
 
       _asm
        {
        push 0
        push [t3]
        push [t2]
        push [th]
        push NULL
        push [t1]
        push [a]
        call [p]
        }
 
 
 
}
Всё компилирует но файл не создает!?!?
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
07.06.2009, 22:14 5
флаги естественно подставите свои.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    const char *a = "C:/file.txt";
    DWORD ReadWrite = GENERIC_READ | GENERIC_WRITE;
    asm
    {
        push 0
        push FILE_ATTRIBUTE_NORMAL
        push OPEN_ALWAYS
        push NULL
        push FILE_SHARE_READ
        push ReadWrite
        push [a]
        call CreateFile
    }
P.S. указатель на функцию здесь делать не нужно. В прошлый раз я сделал это, чтобы обратиться к конкретной функции DeleteFile, которых в билдере две: Sysutils:: DeleteFileA(из VCL) и DeleteFileA(WinApi).
1
49 / 49 / 4
Регистрация: 21.05.2009
Сообщений: 156
07.06.2009, 22:23  [ТС] 6
Ище раз спасибо. А как мне закрыть файл после создания чтобы его можно било сразу же удалить?
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
07.06.2009, 22:43 7
Объявите переменную HANDLE WINAPI handle. Затем сразу после call CreateFile
сделайте mov handle, eax. После этого можно будет вызвать вызвать функцию CloseHandle передав ей handle в качестве параметра. Ну а дальше удаляете файл когда захотите.
1
49 / 49 / 4
Регистрация: 21.05.2009
Сообщений: 156
09.06.2009, 02:57  [ТС] 8
Спасибо большое!!! Все работает. А вы умный человек

Добавлено через 21 час 17 минут 58 секунд
Может ещё подскажете. Как мне средствами ВинАпм удалить непустую папку ?

Добавлено через 55 минут 25 секунд
С удалением разобрался.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Для того чтобы удалить папку и все файлы в ней напишите следующую функцию:
bool DeleteDir(AnsiString DirName)
{
TSearchRec sr;
if (DirName.Length())
 {
 if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
 do
  {
  if (!(sr.Name=="." || sr.Name==".."))// это удалять не надо
   if (((sr.Attr & faDirectory) == faDirectory ) ||
   (sr.Attr == faDirectory))// найдена папка
    {
    FileSetAttr(DirName+"\\"+sr.Name, faDirectory );// сброс всяких read-only
    DeleteDir(DirName+"\\"+sr.Name);//рекурсивно удаляем содержимое
    RemoveDir(DirName + "\\"+sr.Name);// удаляем теперь уже пустую папку
    }
    else// иначе найден файл
    {
    FileSetAttr(DirName+"\\"+sr.Name, 0);// сброс всяких read-only
    DeleteFile(DirName+"\\"+sr.Name);// удаляем файл
    }
  }
 while (!FindNext(sr));// ищем опять, пока не найдем все
 FindClose(sr);
 }
RemoveDir(DirName);
return true;
}
А как скопировать?

Добавлено через 5 часов 57 минут 11 секунд
Уточню. Как мне скопировать непустую папку засобами WinApi? Может ктото ищё знает. Помогите пожалуйста.... очень надо...
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
09.06.2009, 14:23 9
C++
1
2
3
4
5
6
7
8
9
10
11
    SHFILEOPSTRUCT FileCopyStruct;
    FileCopyStruct.hwnd = NULL;
    FileCopyStruct.wFunc = FO_COPY;
    FileCopyStruct.pFrom = "C:/b\0";    //0 в конце обязателен
    FileCopyStruct.pTo = "C:/a/b/\0"; //0 в конце обязателен
    FileCopyStruct.fFlags = FOF_NOCONFIRMATION | FOF_RENAMEONCOLLISION | FOF_MULTIDESTFILES;
    FileCopyStruct.fAnyOperationsAborted = FALSE;
    FileCopyStruct.hNameMappings = NULL;
    FileCopyStruct.lpszProgressTitle = NULL;
 
    SHFileOperation(&FileCopyStruct);
0
49 / 49 / 4
Регистрация: 21.05.2009
Сообщений: 156
09.06.2009, 16:54  [ТС] 10
rangerx, Мне нужно на WinApi Шелапи нелзя использовать ((((
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
09.06.2009, 17:33 11
CopyFile в винапи есть, по-моему, проще и удобнее, чем код приведенный выше...
0
49 / 49 / 4
Регистрация: 21.05.2009
Сообщений: 156
09.06.2009, 17:38  [ТС] 12
CopyFile в винапи есть, по-моему, проще и удобнее, чем код приведенный выше...
Мне нужно скопировать непустую папку а не файл...
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
09.06.2009, 17:50 13
ZVolodumur, создаешь в нужном месте папку и файлы копируешь, в чем проблема, чтобы все за тебя одна функция сделала?
0
49 / 49 / 4
Регистрация: 21.05.2009
Сообщений: 156
09.06.2009, 17:53  [ТС] 14
Ето я понимаю. Но если в той папке ещё другие папки будут? Их можно рекурсивно обраьатывать... Но я чота неочень знаю как это реализовать...

Добавлено через 1 минуту 1 секунду
создаешь в нужном месте папку и файлы копируешь, в чем проблема, чтобы все за тебя одна функция сделала?
Эсли б там только файлы были проблемы б невозникло...
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
09.06.2009, 18:14 15
считываем содержимое findfirst, findnext (в случае вложенных папок используем рекурсию) и копируем
0
49 / 49 / 4
Регистрация: 21.05.2009
Сообщений: 156
09.06.2009, 18:20  [ТС] 16
считываем содержимое findfirst, findnext (в случае вложенных папок используем рекурсию) и копируем
Теоретически я и сам это знаю... А вот как на практике реализовать.... С того примера з Удалением что я вылодыл тяжело переделать?
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
09.06.2009, 19:07 17
нет, почти тоже самое
0
49 / 49 / 4
Регистрация: 21.05.2009
Сообщений: 156
09.06.2009, 19:11  [ТС] 18
А как произвести копирование или перемещение на другой логический диск?
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
09.06.2009, 19:24 19
copyfile - это копирование файла, а вот с папками есть только создание и удаление
0
49 / 49 / 4
Регистрация: 21.05.2009
Сообщений: 156
09.06.2009, 19:45  [ТС] 20
copyfile - это копирование файла, а вот с папками есть только создание и удаление
Это я понимаю... но мне нужно напремер файл скопировать с одного логического диска на другой. Как быть?
0
09.06.2009, 19:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2009, 19:45
Помогаю со студенческими работами здесь

Как заставить проект Builder 6 загруженный в Builder 2007 отображать новые кнопки
Люди добрые, кто нибудь встречался с такой проблемой: Я установил Builder 2007, загрузил в него...

Какой компилятор C++ Builder использовать? Rad Studio 2009 глючит. C++ Builder 6 старый
Много раз замечал непонятки с компилятором. Масла в огонь подлил Какой посоветуете?

Как заставить проект сделанный на C++ Builder 6.0 работать на компьютере на котором не установлен этот самый Builder
вопрос абсолютно нубский,но очень волнует...но как заставить проект сделанный на C++ Builder 6.0...

можно ли в С++ Builder 2006 писать программы на С++ Builder 6?
подскажите, пожалуйста... если программка написана на С++ Builder 2006, могу ли я перевести проект...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru