Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> wnaspi32.dll, Работа с библиотекой на чистом WIN32API? 
V
    Опции темы
WIN32API
Дата 12.5.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



Здравствуйте, уважаемые... Использую wnaspi32.dll. Естественно есть заголовочные файлы к этой библиотеке. Вопрос в том, 
как добавить CD-устройства в ComboBox на чистом WIN32API. У меня есть пример, использующий TObject, а надо без него. Немогу разобрать откуда берется идентификатор, который заносится в TObject при заполнении 
PM MAIL   Вверх
Rouse_
Дата 12.5.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



На АПИ? Через отпраку управляющей команды CB_ADDSTRING на хэндл ComboBox-а. 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
WIN32API
Дата 12.5.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



Цитата

Немогу разобрать откуда берется идентификатор, который заносится в TObject при заполнении  

Єто вопрос для тех, кто работал с wnaspi32.dll без VCL. Мне сложновато сформулировать его правильно... 
PM MAIL   Вверх
Rouse_
Дата 12.5.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



ComboBox.Handle даст тебе описатель оконного элемента которому необходимо послать сообщение. 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
WIN32API
Дата 12.5.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



В чужом примере на VCL в КомбоБокс идет запись:

ComboBox1.Items.AddObject(String, tObject)

В tObject вносится идентификатор СD-устройства типа - 345677.
Откуда он берется и как его мне зацепить? 
PM MAIL   Вверх
Rouse_
Дата 12.5.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Тэкс, чуствуется что ты чего-то очень сильно не понимаешь. Здается мне что 345677 это указатель на  область памяти с экземпляром объекта типа ТObject. Давай код чужого примера... 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
WIN32API
Дата 13.5.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



Там одна функция тянет за собой другую. Разобратся сложно. Попробую что-то вырезать... 
PM MAIL   Вверх
WIN32API
Дата 14.5.2006, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



Код

var 
 fDevice : TDeviceID;

function ASPIEnumCallBack(lpUserData : pointer; Device : TDeviceID) : boolean;
var SDInfo    : TScsiDeviceInfo;
    HandleFlags,
    DriveInfo : string;
begin
   with TObject(lpUserData) as TForm1 do begin
      SCSIinquiryDeviceInfo(Device, SDInfo, SCSI_DEF);
       DriveInfo := SDInfo.ProductID + '  (' + SDInfo.VendorID + ')';
      HandleFlags := '';
      //Как перевести это на API?
      ComboBox1.Items.AddObject(ScsiDeviceIDtoStr(Device)
                              + '   '
                              + DriveInfo, TObject(Device));
   end;
   Result := True;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
 if AspiEnumDevices(TSDCDROM, ASPIEnumCallBack, Form1) > 0 then
  //и это?
  fDevice := TDeviceID(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
end;
 
PM MAIL   Вверх
Voyager
Дата 14.5.2006, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 4
Всего: 18



Код

//Определение колличества пунктов в ComboBox
function ComboBox_GetItemCount(hComboBox: HWND): Integer;
begin
 Result := SendMessage(hComboBox, CB_GETCOUNT, 0, 0);
end;

//Удаление определенного пункта в ComboBox
procedure ComboBox_DeleteItem(hComboBox: HWND; Index: Integer);
begin
 SendMessage(hComboBox, CB_DELETESTRING, Index, 0);
end;

//Удаление всех пунктов в ComboBox
procedure ComboBox_ClearItems(hComboBox: HWND);
begin
 SendMessage(hComboBox, CB_RESETCONTENT, 0, 0);
end;

//Добавление пункта в ComboBox
procedure ComboBox_AddItem(hComboBox: HWND; NewItem: String);
begin
 SendMessage(hComboBox, CB_ADDSTRING, 0, Integer(NewItem));
end;

//Добавление пункта в определенное место в ComboBox
procedure ComboBox_InsertItem(hComboBox: HWND; Index: Integer; NewItem: String);
begin
 SendMessage(hComboBox, CB_INSERTSTRING, Index, Integer(NewItem));
end;

//Определение имени выбранного пункта в ComboBox
function ComboBox_GetSelectedItem(hComboBox: HWND): string;
var
 Index, len: Integer;
 s: string;
 buffer: PChar;
begin
 Index := SendMessage(hComboBox, CB_GETCURSEL, 0, 0);
 len := SendMessage(hComboBox, CB_GETLBTEXTLEN, wParam(Index), 0);
 GetMem(buffer, len + 1);
 SendMessage(hComboBox, CB_GETLBTEXT, wParam(Index), lParam(buffer));
 SetString(s, buffer, len);
 FreeMem(buffer);
 Result := s;
end;

//Определение номера выбранного пункта в ComboBox
function ComboBox_GetCountSelectedItem(hComboBox: HWND): Integer;
var
 Index, len: Integer;
 s: string;
 buffer: PChar;
begin
 Index := SendMessage(hComboBox, CB_GETCURSEL, 0, 0);
 len := SendMessage(hComboBox, CB_GETLBTEXTLEN, wParam(Index), 0);
 GetMem(buffer, len + 1);
 SendMessage(hComboBox, CB_GETLBTEXT, wParam(Index), lParam(buffer));
 SetString(s, buffer, len);
 FreeMem(buffer);
 Result := Index;
end;

//Определение имени пункта по номеру в ComboBox
function ComboBox_GetItem(hComboBox: HWND; LbItem: Integer): string;
var
 l: Integer;
 buffer: PChar;
begin
 l := SendMessage(hComboBox, CB_GETLBTEXTLEN, LbItem, 0);
 GetMem(buffer, l + 1);
 SendMessage(hComboBox, CB_GETLBTEXT, LbItem, Integer(buffer));
 Result := StrPas(buffer);
 FreeMem(buffer);
end;

//Выбор пункта в ComboBox по счету
procedure ComboBox_SelectedItem(hComboBox: HWND; Index: Integer);
begin
 SendMessage(hComboBox, CB_SETCURSEL, Index, 0);
end;

//Выбор пункта в ComboBox по имени
procedure ComboBox_SelectedString(hComboBox: HWND; Text: String);
begin
 SendMessage(hComboBox, CB_SELECTSTRING, 0, Integer(Text));
end;

//Открытие пунктов ComboBox
procedure ComboBox_OpenItems(hComboBox: HWND);
begin
 SendMessage(hComboBox, CB_SHOWDROPDOWN, Integer(True), 0);
end;


 
PM   Вверх
WIN32API
Дата 15.5.2006, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



Да это все понятно. Внимательно на код посмотрите. Там добавляется TObject(Device)???????????????

Код

ComboBox1.Items.AddObject(ScsiDeviceIDtoStr(Device)
                              + '   '
                              + DriveInfo, TObject(Device));
 
PM MAIL   Вверх
Rouse_
Дата 16.5.2006, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Это указатель на экземпляр класса...
В твоем случе 
Код

SendMessage(ComboboxHandle, CB_SETITEMDATA, ItemIndex, Integer(@TObject(Device)));

А берется он отседова: SCSIinquiryDeviceInfo
Получить обратно экземпляр:
Код

type
  PObject = ^TObject;
var
  Object: TObject;
begin
  Object := PObject(SendMessage(ComboboxHandle, CB_GETITEMDATA, ItemIndex, 0)^;
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
WIN32API
Дата 16.5.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



На основе кода от Rouse_  и  Voyager я сделал следующее, но где-то допустил ошибку и чувствую, что не одну.... 

Код

var
 CD_ROM_DEVICE: TDeviceID; //сидюк
 Combobox1: HWND; //комбобокс
 ItemIndex: Integer;

function ASPIEnumCallBack(lpUserData : pointer; Device : TDeviceID) : boolean;
var
 SDInfo: TScsiDeviceInfo;
 DriveInfo: string;
begin
 SCSIinquiryDeviceInfo(Device, SDInfo, SCSI_DEF);
 DriveInfo := SDInfo.ProductID + '   (' + SDInfo.VendorID + ')';
 ComboBox_AddItem(combobox1, DriveInfo); //добавляем сидюки в комбобокс
  //Допустим, сидюков 10 или ItemIndex играет другую роль??????
  for ItemIndex := 1 to High(10) do
   SendMessage(combobox1, CB_SETITEMDATA, ItemIndex, Integer(@TObject(Device)));
 Result := True; //to continue scanning
end;

function DlgProc(hWin: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): bool; stdcall;
begin
 Result := False;
  case uMsg of
   WM_INITDIALOG:
    begin
     combobox1 := GetDlgItem(hWin, 11);
      if AspiEnumDevices(TSDCDROM, @ASPIEnumCallBack, @hWin) > 0 then
       ComboBox_SelectedItem(combobox1, 0);
     //Получаем устройство
     CD_ROM_DEVICE := TDeviceID(SendMessage(combobox1, CB_GETITEMDATA, ComboBox_GetCountSelectedItem(combobox1), 0));
    end;
  WM_COMMAND:
   case LoWord(wp) of
    30: SCSIstartStopUnit(CD_ROM_DEVICE, False, True, True, SCSI_DEF); //Open CD Door
    31: SCSIstartStopUnit(CD_ROM_DEVICE, True, True, True, SCSI_DEF); //Close CD Door
   end;
   //При нажатии на кнопку "Х" в шапке программы закрываем приложение
   WM_DESTROY, WM_CLOSE: PostQuitMessage(0);
 end;
end;
 
PM MAIL   Вверх
Rouse_
Дата 16.5.2006, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



ItemIndex это индекс элемента с которым ты хочешь асоцииорвать информацию.
В твоем коде, ты добавляешь один единственный элемент, его индекс ноль
Соответственно вот этот код не имеет смысла, т.к. элементов с такими индексами не существует:
Код

  for ItemIndex := 1 to High(10) do
   SendMessage(combobox1, CB_SETITEMDATA, ItemIndex, Integer(@TObject(Device)));

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

TDeviceID(SendMessage(combobox1, CB_GETITEMDATA, ComboBox_GetCountSelectedItem(combobox1), 0));
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
WIN32API
Дата 16.5.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



Так как же сделать то???????????????? Помогите!  smile  
PM MAIL   Вверх
WIN32API
Дата 17.5.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.4.2006

Репутация: нет
Всего: нет



С добавление вроде разобрался???? А вот с чтение траблы. Помогите.!!!!


Код

type
  PObject = ^TObject;

var
 CD_ROM_DEVICE: TDeviceID; //сидюк
 Combobox1: HWND; //комбобокс
 ItemIndex: Integer;
 _Object: TObject;

function ASPIEnumCallBack(lpUserData : pointer; Device : TDeviceID) : boolean;
var
 SDInfo: TScsiDeviceInfo;
 DriveInfo: string;
begin
 SCSIinquiryDeviceInfo(Device, SDInfo, SCSI_DEF);
 DriveInfo := SDInfo.ProductID + '   (' + SDInfo.VendorID + ')';
 
  ItemIndex := SendMessage(ComboBox1, CB_ADDSTRING, 0, Integer(DriveInfo));
 for ItemIndex := 0 to ComboBox_GetItemCount(combobox1) - 1 do
   SendMessage(combobox1, CB_SETITEMDATA, ItemIndex, Integer(@TObject(Device)));

 Result := True; //to continue scanning
end;

//Функция, обрабатывающая все команды от элементов управления окна
function DlgProc(hWin: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): bool; stdcall;
begin
 Result := False;
  case uMsg of
   WM_INITDIALOG:
    begin
     combobox1 := GetDlgItem(hWin, 11);
      if AspiEnumDevices(TSDCDROM, @ASPIEnumCallBack, @hWin) > 0 then
       ComboBox_SelectedItem(combobox1, 0);
  //Вот здесь Рантайм эррор...
     _Object := PObject(SendMessage(Combobox1, CB_GETITEMDATA, ItemIndex, 0))^;

............
 
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0872 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.