Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Теллес М. - Borland C++ Builder. Библиотека программиста - 1998

.pdf
Скачиваний:
764
Добавлен:
13.08.2013
Размер:
4.35 Mб
Скачать

Borland C++ Builder (+CD). Библиотека программиста 201

Что мы узнали в этой главе?

Честно говоря, эта глава на самом деле не предназначалась для того, чтобы обучить вас многому в программировании на CBuilder. Я надеюсь, теперь вы имеете гораздо лучшее представление об утилитах и вспомогательных программах, поставляемых с системой. Одна из самых частых жалоб, которую я слышал от многих программистов, сводится к тому, что среда разработки не позволяет делать то, что им нужно. CBuilder в этом смысле позволяет делать многое из того, что вам может быть нужно, причем настолько просто, насколько это возможно.

Вконце концов, утилиты, поставляемые с CBuilder, ценны не меньше, чем интегрированная среда. То, что вы получаете от системы разработки, зависит от вашего желания изучать инструменты, предоставленные вам для вашей работы.

Вследующей главе, я обещаю, мы вернемся к программированию.

Глава 9. Работа с Windows API

Выбор нужной функции API

Запрещение запуска второй копии приложения

Перетаскивание файлов

Просмотр атрибутов файлов

Круглые окна?

Windows API (Application Programming Interface, интерфейс программирования приложений в

Windows) незримо присутствует за всем блеском VCL и чудесами интегрированной среды разработки CBuilder. В VCL нет ничего, что нельзя было бы сделать в Windows API, и по очень простой причине. Все в Windows работает через API. Операционная система сама поддерживает этот интерфейс и использует его во всех своих вспомогательных программах. Независимо от того, насколько сложен код, в конце концов все сводится к вызовам API.

Windows API содержит несколько тысяч разных функций, разделенных на десятки основных категорий. Если вы хотите изучить API, не лучше ли просто сесть и прочитать документацию, пока вы не найдете функции, нужные вашему приложению. Нет, не лучше. Изучение связей между функциями API может занять годы, а написание программы месяцы, и в общем-то основная идея VCL и CBuilder и заключается в том, чтобы избавить себя от общения со всем этим.

Избегать Windows API — правильный подход, я настоятельно рекомендую вам его. Однако бывает, что VCL не может сделать то, что вам нужно, тем самым повергая вас в пучину Windows API (если вы, конечно, хотите сделать работу). Если вы программист на Delphi или Visual Basic, то вы уже, наверное, содрогаетесь от ужаса. Общение с Windows API в этих языках может стать кошмаром, если нужная функция запрашивает типы данных, которых у вас нет.

К счастью, CBuilder использует не Basic или Pascal, а C++. Общение с Windows API из C++ не труднее, чем это было на изначальном языке программирования для API — С. Так что ваша работа уже будет проще. Есть только один вопрос: когда нужно обращаться к Windows API?

В этой главе мы изучим несколько вещей, для которых нужно использовать Windows API. Например, в CBuilder нет прямого способа выяснить, запустил ли уже пользователь копию вашего приложения. Если ваша программа надеется на единоличное владение каким-нибудь файлом на диске (например, базой данных) и запускаются две копии приложения, то результаты будут просто страшными. Исследование проблем, связанных с множественными копиями программы, запущенными одновременно, — нетривиальная работа. Обычно гораздо проще запретить пользователю запускать вторую копию. Это не годится для небольших утилит, которые

Borland C++ Builder (+CD). Библиотека программиста 202

пользователь может захотеть запустить в двух экземплярах, но вполне подходит для корпоративных приложений.

Еще одним примером использования Windows API может служить определение размера свободного места на диске, получение метки диска, атрибутов файлов и другой информации, хранящейся в системе. Этот вопрос также будет рассмотрен в текущей главе.

Общение с файлами, «перетащенными» на ваше приложение , — одна из основных проблем при использовании операционной системы Windows 95/NT. Например, вам может понадобиться разрешить пользователю выбрать несколько файлов для обработки в генераторе отчетов. Другим программам может, например, понадобиться список перетащенных файлов для отправки их по Internet. Что бы вы ни делали, VCL поможет вам но не всегда! Добавить обработчик сообщения, которое посылается при перетаскивании файлов, тривиально. Но объяснить системе, что вам в первую очередь нужно перетащить файлы, исключительно средствами VCL невозможно. В этой главе вы поймете, как это сделать с минимумом проблем и затрат.

Последняя проблема для программиста разработка окон нестандартного вида, которые почему- то нравятся некоторым пользователям. Как именно вы объясните VCL, что хотите, чтобы ваши кнопки были круглыми? Ответ лежит вы угадали в Windows API. Его мы также разберем в данной главе.

Поиск нужной функции API

Самая большая проблема при работе с несколькими тысячами функций Windows API заключается не в их вызове, а в выборе нужной. Здесь реальную помощь оказывают файлы справки по Win32 SDK. Как это ни странно, Borland поставляет копии файлов Win32 SDK Help вместе с системой CBuilder. Переместившись в каталог CBuilder\Help, вы увидите другой каталог, MSHelp. Внутри этого каталога вы найдете несколько файлов справки, включая файл справки KnowledgeBase (база знаний) (Kbase.hlp) и файл справки Win32 SDK (Win32SDK.hlp). Вы можете или добавить эти файлы к среде Borland OpenHelp, или просто добавить их в меню Tools интегрированной среды

CBuilder.

Файл справки KnowledgeBase полезен, когда вы пытаетесь выяснить, каким именно образом решить какую-нибудь стандартную программистскую проблему.

Пролистав этот файл справки, я тут же нашел информацию о таких проблемах, как:

·получение информации о гибких дисках;

·получение имени файла через ссылку (instance) на окно;

·GLLT.EXE: Пример: Демонстрирует простую подсветку в OpenGL.

Эти примеры всего лишь кусочек сотен независимых статей базы KnowledgeBase, которая представлена в виде файла справки для помощи в написании и отладке приложений под Windows. По очевидным причинам этот файл справки не содержит информации о CBuilder (в конце концов, это не продукт Microsoft), но знание нужной для данной задачи функции API может помочь вам при написания того, что вам нужно в CBuilder.

Второй файл в этом каталоге, Win32SDK.hlp, из тех, к которым вы будете обращаться наиболее часто. Этот файл содержит полный листинг функций Win32 SDK в формате справочной системы. Вы можете найти нужную функцию по имени, чтобы посмотреть, какие у нее параметры, просматривать функции по категориям и исследовать структуры, используемые данными функциями API в этом файле справки.

Borland C++ Builder (+CD). Библиотека программиста 203

Для поиска специфической функции используйте файл Win32SDK.hlp, так как он оптимизирован для поиска отдельных функций. Для выяснения же пути решения конкретной задачи лучше смотреть файл справки KnowledgeBase, так как он ориентирован более на задачи и проблемы, чем файл SDK.

Итак, как именно вам найти функцию, делающую что-то, нужное вашему приложению? Ответ прост: искать функцию, более-менее подходящую по названию, или спросить кого-нибудь, кто уже этим занимался. Вот где пригодятся конференции Internet News Groups (USENET) или книжки типа этой. Вы обычно учитесь в процессе, и те из вас, кто занимался этим с тех пор, когда SDK был единственным вариантом, быстро найдут нужную функцию. Люди, стартовавшие прямо с CBuilder, находятся здесь в определенном затруднении. Я настоятельно вам рекомендую взять хорошую книгу по основам программирования под Windows и прочитать ее от корки до корки. Вы, может быть, никогда и не будете ничего писать на С на низком уровне, используя SDK, но тем не менее вы ничего не потеряете, если будете понимать, как это делается. Это также поможет вам оценить, какой объем работы делают за вас автоматически VCL и CBuilder.

Давайте сразу начнем с очень простого примера, показывающего мощь API. Проблема, которую мы пытаемся решить, — как запретить пользователю запускать вторую копию приложения. На самом деле нам, конечно, хочется не только запрещать запускать вторую копию приложения, но и при попытке запуска второй копии приложения выдвигать окно первой копии на передний план, чтобы оно было видно. Частенько пользователь вовсе не собирается запускать вторую копию, просто он «теряет» окно первой копии за другими окнами.

Приложение OnlyOnce

На рис. 9.1 представлена форма, которую мы будем использовать для приложения OnlyOnce (ТолькоРаз). Как видите, ничего особенного на форме нет; на ней находится единственная метка статического текста, говорящая пользователю не запускать вторую копию. Хорошо запомните эту форму, так как больше мы на нее смотреть не будем.

Когда вы создадите новое приложение в CBuilder и форму, как на рис. 9.1, закройте форму. Работа, которую нам нужно сделать, производится не над формой, а над исходным кодом приложения.

Выберите команду View|Project Source из главного меню интегрированной среды CBuilder. В редактор будет загружен исходный файл проекта (project1.cpp). Посмотрите на этот код, приведенный в листинге после рис. 9.1.

Рис. 9.1. Форма приложения OnlyOnce

Borland C++ Builder (+CD). Библиотека программиста 204

//---------------------------------------------------------

#include <vcl\vcl.h> #pragma hdrstop

//---------------------------------------------------------

USEFORM("Unit1.cpp", Form1); USERES("Project1.res"); //---------------------------------------------------------

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run();

}

Поиск нужной функции API catch (Exception &exception)

{

Application->ShowException(&exception);

}

return 0;

}

Не так уж и много можно сказать про эту процедуру. Функция WinMain это точка входа для всех Windows-приложений в любой версии Windows. Она будет вызвана при старте программы. На самом деле есть еще часть глобального кода, которая запускается перед этой функцией (код, запускающий приложение). Код, запускающий приложение, отвечает за создание объекта Application. Все дальнейшее происходит здесь.

Процесс запуска приложения в CBuilder состоит из трех шагов. Во-первых, инициализируется объект Application. Это важно только в том случае, если ваша программа сервер OLE Automation. Если ваша программа не сервер, то можете удалить эту строчку из кода приложения.

Как только объект инициализирован, создаются все формы, предназначенные для автоматического создания. Такие формы перечислены в окне Project Manager (менеджер проектов) в системе CBuilder. Обычно, если вы не укажете обратное, то все формы, которые вы добавляете в проект, помечаются системой как создаваемые автоматически (auto-create).

Зачем вам может понадобиться отключить автоматическое создание формы? Если вы пишете MDI-приложение, то вам не всегда нужно, чтобы дочернее окно MDI создавалось при запуске приложения. Или, может быть, вы не захотите, чтобы форма присутствовала в приложении, если это редко используемое окно диалога, или же у вас есть набор форм, которые по смыслу исключают друг друга во время работы приложения.

Последний шаг процесса запустить приложение. Это делается вызовом метода Run объекта Application в стартовом коде. Этот вызов не вернется обратно, пока главная форма приложения не будет закрыта или не будет вызвана функция Application->Terminate().

Запрет запуска второй копии

Для того чтобы не запускать вторую копию приложения, нам нужно не давать приложению создавать формы и не давать запускать метод Run. Для этого мы сначала должны определить при

Borland C++ Builder (+CD). Библиотека программиста 205

запуске программы, есть ли уже запущенная копия приложения.

В Windows API нет прямого метода поиска программы. В старые времена в Windows 3.1 существовал параметр, передаваемый нашей функции WinMain, называющийся hPrevInstance (ссылка на предыдущую копию приложения), который можно было проверить. В программах под Windows 95/NT этот параметр всегда будет равен NULL. Однако можно найти окно с таким же заголовком, как и программа, которую вы пытаетесь запустить. Это делается при помощи функции FindWindowEx.

Функция API FindWIndowEx имеет четыре параметра: имя класса окна, заголовок окна, а также две ссылки, идентифицирующие дочернее и родительское окно.

Один или оба параметра «имя класса» и «заголовок» могут быть равны NULL, а также один или оба параметра, содержащих ссылки на окна, могут быть равны NULL. Если ссылка на родительское окно равна NULL, то поиск будет идти по всем окнам верхнего уровня (главным окнам).

Что мы хотим, так это все окна верхнего уровня, которые имеют такое же имя, что и окно нашей программы. Добавьте следующий код в функцию WinMain перед выражением try {, которое запускает весь код объекта Application:

HWND hWnd;

hWnd = FindWindowEx(

NULL, // ссылка на родительское окно NULL, // ссылка на дочернее окно NULL, // указатель на имя класса

"OnlyOne" // Имя окна );

if (hWnd != NULL)

{

BringWindowToTop(hWnd); return 0;

}

Этот код будет искать окно с текстом «OnlyOne» среди окон верхнего уровня. Если функция FindWindowEx найдет такое окно, то она вернет ссылку (handle) на это окно (примерно то же самое, что и свойство FormHandle в CBuilder). В таком случае мы используем вторую функцию API, BringWindowToTop, для выноса этого окна на передний план. BringWindowToTop имеет один параметр ссылку на окно, которое нужно переместить.

После перемещения старого приложения на передний план нам нужно предотвратить запуск нового. Программа заканчивает работу, когда происходит выход из функции WinMain, так что проще всего выполнить оператор return (возврат из функции) в этот момент. Значение, которое вы возвращаете, традиционно является значением, возвращаемым программой, но используется оно редко, так что мы просто возвращаем 0.

Замечание

Не пытайтесь запускать это приложение из интегрированной среды CBuilder. Закройте CBuilder и затем запустите программу из проводника Windows. IDE системы CBuilder, похоже, держит скрытое окно с заголовком нашей формы. Когда функция FindWindowEx найдет это окно, она скажет вам об этом, и ваше приложение никогда не запустится.

Borland C++ Builder (+CD). Библиотека программиста 206

Вот и все касательно запрета на запуск второй копии вашего приложения. Вы теперь можете добавлять этот код во все ваши программы и больше не беспокоиться о том, что программа может быть запущена дважды.

Перетаскивание файлов

Когда программисты разговаривают о Windows 95 или Windows NT, они часто говорят о перетаскивании (drag-and-drop), и выше в книге мы рассматривали

пример перетаскивания данных между двумя списками в форме. Однако под drag-and-drop понимается также и нечто другое. Программа Windows Explorer (проводник) позволяет, как и прочие, перетаскивать файлы в другие программы. Иногда, например, при перетаскивании файла на иконку программы эта программа запускается с параметром именем этого файла. В других случаях это действие позволяет вам обрабатывать файлы, перетаскивая их из проводника в работающую программу. В этом примере мы как раз и рассмотрим данный случай.

Обработка drag-and-drop связана с тремя моментами. Во-первых, нужно объяснить системе Windows, что на вашу программу можно перетаскивать файлы. Во-вторых, нужно обрабатывать сообщения, которые Windows посылает вам, когда файл «роняется» на окно вашего приложения. И наконец, нужно что-то делать с этими перетащенными файлами.

Система CBuilder поддерживает некоторые формы перетаскивания, но только внутри системы. Если вы хотите обработать перетаскивание в системе CBuilder, то вам нужно слегка порыться в Windows API (именно поэтому, конечно, это и находится в данной главе). Давайте посмотрим на каждый кусочек отдельно, чтобы понять, что происходит.

Информирование Windows о том, что ваша программа принимает перетаски ваемые файлы, — довольно простая задача. Все, что нужно, — один вызов API, функция DragAcceptFiles. Эта функция API принимает два аргумента: ссылку на окно и логический флаг. Ссылка это ссылка на окно, на которое вы хотите разрешить «ронять» файлы. Логическое значение же указывает, будет ли это окно (true) или нет (false) воспринимать перетащенные файлы. Очевидно, что переключая это значение, вы можете разрешать или запрещать перетаскивание во время работы программы. Я лично ни разу не встречал ситуации, в которой надо было бы отключить разрешение на перетаскивание, но, как мне кажется, такая ситуация возможна.

Когда вы сказали системе, что вы воспринимаете перетаскиваемые файлы, следующий шаг ждать, пока не придет сообщение о том, что вам «притащили» файл. Оно приходит в виде сообщения WM_DROPFILES, посылаемого вашей оконной функции. В форме CBuilder вы можете добавить функцию-обработчик сообщения. Сообщение WM_DROPFILES говорит вам о том, что система «роняет» один или более файлов на ваше окно, но оно не говорит вам, что это за файлы. Ваша работа как программиста запрашивать информацию о каждом файле и соответственно его обрабатывать.

Третий шаг, обработка файла, зависит от приложения. Может быть, вам нужно открыть файл и прочитать из него данные. Может, удалить его или скопировать его куда-то еще. Что бы вам ни было нужно, у вас будет имя файла, с которым можно работать. Ваши действия с ним ваш выбор.

На рис. 9.2 приведена форма, которую мы собираемся использовать в примере приложения DragDropFiles. На этой форме находиться одно поле статического текста Файлы, перетащенные сюда:»), кнопка, закрывающая форму, и окно списка для отображения файлов, которые будут перетащены на форму. В этом примере мы ничего не делаем с данными, только

Borland C++ Builder (+CD). Библиотека программиста 207

отображаем для пользователя имена файлов.

Рис. 9.2. Форма приложения DragDropFiles

Первым делом, как мы уже говорили, надо сказать системе, что окно этой формы будет принимать файлы, перетащенные на него. Создайте обработчик события OnCreate для формы и добавьте в метод FormCreate следующий код:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

// Позволить нашей форме принимать файлы

DragAcceptFiles (Handle, TRUE);

}

Здесь мы уведомляем операционную систему о том, что будем принимать файлы, перетащенные на форму (на это указывает аргумент функции, равный TRUE).

Обработка притащенных файлов

Когда мы сказали Windows о том, что будем обрабатывать перетащенные файлы, можно расслабиться и ждать, пока их к нам не притащат. Для этого события мы ждем сообщения WM_DROPFILES. В классе TForm нет прямого обработчика для этого сообщения, так что нам нужно добавить элемент в карту сообщений для формы, как мы делали в предыдущих примерах. Добавьте следующие строки в заголовочный файл для класса формы. Эти строки определят новый обработчик стандартного сообщения Windows и затем свяжут его с сообщением

WM_DROPFILES:

class TForm1 : public TForm

{

__published: // IDE-managed components TListBox *ListBox1;

TLabel *Label1;

TButton *Button1;

void __fastcall Button1Click(TObject *Sender); void __fastcall FormCreate(TObject *Sender); private: // User declarations

void __fastcall HandleDropFiles(TMessage& Msg); public: // User declarations

Borland C++ Builder (+CD). Библиотека программиста 208

__fastcall TForm1(TComponent *Owner); BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(WM_DROPFILES, TMessage, HandleDropFiles);

END_MESSAGE_MAP(TForm)

};

После того как мы описали процедуру, которая должна делать всю работу, осталось только написать саму эту процедуру. Давайте сначала взглянем на код, а затем выясним, как он работает: void __fastcall TForm1::HandleDropFiles(TMessage& Msg)

{

//Получить информацию о перетащенном из сообщения

HDROP hDropInfo = (HANDLE)Msg.WParam; char szFileName[_MAX_PATH];

int iFiles = DragQueryFile(hDropInfo, (DWORD)-1, (LPSTR)NULL, 0);

//Для каждого притащенного файла поместить его

//в массив Items списка

for (int nIdx = 0; nIdx < iFiles; ++nIdx)

{

DragQueryFiles (hDropInfo, nIdx, szFileName, _MAX_PATH); ListBox1->Items->Add (szFileName) ;

}

}

Сначала мы получаем объект типа HDROP, преобразуя элемент сообщения WParam к этому типу. HDROP на самом деле просто индекс списка перетащенных файлов в системе. Используйте ссылку HDROP для получения отдельных файлов в блоке перетащенных.

Функция API DragQueryFile имеет два разных метода ее использования (как, вы не любите такие функции?). Если вы вызовете ее с индексом _1 и указателем, равным NULL, то она вернет вам количество элементов в списке перетащенного. Это и есть количество файлов, которые пользователь выделил в Windows Explorer и перенес на ваше приложение. Если вы не хотите разрешать перетаскивать сразу много файлов за раз, то можете добавить сюда код, который останавливается, если количество файлов больше 1. Заметьте, что вы никогда не получите это сообщение, если список пуст.

Когда у нас есть несколько файлов в списке, вступает в игру второй вариант использования функции DragQueryFile. Если вы передадите нормальный индекс (второй аргумент функции) и буфер для хранения полученного имени файла, то функция передаст вам имя каждого файла в списке. Как вы помните, Explorer работает с длинными именами файлов, так что нам нужно иметь буфер, достаточный для размещения имени файла, перетащенного на наше окно. Макрос _MAX_PATH, определенный в системных заголовочных файлах, определяет размер, гарантиро ванно достаточный для хранения любого имени файла (до 256 символов), которое используется в системе Windows. Однако в качестве проверки мы передаем эту длину в функцию API, чтобы, в случае несовместимости в будущем (если имена файлов станут длиннее), программа не рушилась.

В нашем примере все, что нам нужно сделать с именами файлов, — это добавить их в наш список. Потом пользователь, например, может выбрать несколько файлов из этого списка и применить к ним какое-нибудь действие или что-нибудь еще, что нужно вашему приложению. Этот пример довольно прост и ничего больше с файлами не делает, кроме как отображает их имена в списке. Последний штрих обработать нажатие на кнопку закрытия, расположенную внизу формы. Создайте обработчик нажатия на кнопку и добавьте в метод Button1Click формы следующий код:

Borland C++ Builder (+CD). Библиотека программиста 209

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Application->Terminate();

}

Рис. 9.3. Форма приложения DragDropFiles в действии

Как видите, обработка перетаскивания файлов из Windows Explorer очень проста. Чтобы увидеть, как это работает, запустите программу и вызовите Windows

Explorer. Выберите несколько файлов в вашем каталоге и перетащите их (удерживая нажатой левую кнопку мыши на выбранном файле и перемещая мышь за пределы окна) на работающее приложение. Отпустите левую кнопку мыши и посмотрите, какие имена файлов появятся в окне списка.

На рис. 9.3 приведено окно приложения с несколькими файлами, перетащен ными из окна Windows Explorer. Как видите, в списке появляются полные имена файлов (с путем), то есть приложение точно знает, что за файлы были выбраны пользователем и перетащены на форму.

Более сложный пример: просмотр атрибутов файлов

Простые примеры, которые вы видели в этой главе до сих пор, показывали, как сделать одно или два дела, но не показывали реального законченного примера использования Windows API. В этом примере мы рассмотрим не одну или две функции API, а сразу целую группу функций, определенную для файловой системы Windows. Пример, который мы собираемся сделать, — простой броузер атрибутов файлов. В нем можно будет выбрать диск, каталог, а затем будет отображена информация об этом диске, каталоге и файлах, находящихся там.

Windows API предоставляет богатый набор функций, которые работают именно с файловой системой. Есть функции, позволяющие найти файлы, подходящие под заданный критерий (например, файловую маску), функции для определения объема пространства на диске и функции, возвращающие имена меток диска.

В данном примере мы рассмотрим использование всех этих функции для отображения нужной пользователю информации.

Borland C++ Builder (+CD). Библиотека программиста 210

Рис. 9.4. Форма приложения FileAttributeViewer

На рис. 9.4 приведена форма, с которой мы будем работать в этом примере. Вы можете понять, что за информацию мы будем показывать, исходя из типов управляющих элементов, приведенных здесь. Несколько меток статического текста нужны для отображения информации о диске (логическом диске), тогда как сетка строк нужна для отображения информации об отдельных файлах в каталоге, выбранном пользователем. Кнопка Просмотр нужна для запуска процесса, а диалог открытия файлов нужен для выбора каталога, с которым следует работать.

Самое первое действие, которое мы должны выполнить, — инициализировать сетку строк, чтобы заголовки столбцов позволяли пользователю понять, что за информацию он видит. Добавьте следующий код в метод FormCreate (обработчик события формы OnCreate):

void __fastcall TForm1::FormCreate(TObject *Sender)

{

StringGrid1->Cells[0][0] = "File Name";

StringGrid1->Cells[1][0] = "Attributes"; StringGrid1->Cells[2][0] = "Size"; StringGrid1->ColWidths[0] = StringGrid1->ClientWidth / 3; StringGrid1->ColWidths[1] = StringGrid1->ClientWidth / 3; StringGrid1->ColWidths[2] = StringGrid1->ClientWidth / 3; StringGrid1->RowCount = 1;

}

Первым делом пользователь будет выбирать каталог из окна диалога открытия файлов (используя кнопку Просмотр). Создайте обработчик нажатия на кнопку Просмотр и добавьте в обработчик код:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if (OpenDialog1->Execute())

{

//Во-первых, записать диск и каталог

AnsiString strDrive =

ExtractFileDrive (OpenDialog1->FileName) ; AnsiString strDirectory =

ExtractFileDir (OpenDialog1->FileName) ;

//Получить имя метки диска

char szVolName [_MAX_PATH] ; DWORD dwVolumeSerialNumber=0;

DWORD dwMaxVolumeLength = _MAX_PATH;

Соседние файлы в предмете Программирование на C++