PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Что за метаморфозы?


Что за метаморфозы?

Сообщений 1 страница 2 из 2

1

Собственно почему одна и та же функция в разных местах кода выводит разные строки?(тело отметил линиями)

Код:
;{Константы setupapi.h
; Коды свойств реестра устройств
; (Коды, помеченные как доступные только для чтения (R), могут использоваться только для
; SetupDiGetDeviceRegistryProperty)
;
; Эти значения должны охватывать один и тот же набор свойств реестра
; как определено кодами CM_DRP в cfgmgr32.h.
;
; Обратите внимание, что коды SPDRP отсчитываются от нуля, а коды CM_DRP отсчитываются от единицы!
#SPDRP_DEVICEDESC                  = $00000000;DeviceDesc (R/W)
#SPDRP_HARDWAREID                  = $00000001;HardwareID (R/W)
#SPDRP_COMPATIBLEIDS               = $00000002;CompatibleIDs (R/W)
#SPDRP_UNUSED0                     = $00000003;unused
#SPDRP_SERVICE                     = $00000004;Service (R/W)
#SPDRP_UNUSED1                     = $00000005;unused
#SPDRP_UNUSED2                     = $00000006;unused
#SPDRP_CLASS                       = $00000007;Class (R--tied To ClassGUID)
#SPDRP_CLASSGUID                   = $00000008;ClassGUID (R/W)
#SPDRP_DRIVER                      = $00000009;Driver (R/W)
#SPDRP_CONFIGFLAGS                 = $0000000A;ConfigFlags (R/W)
#SPDRP_MFG                         = $0000000B;Mfg (R/W)
#SPDRP_FRIENDLYNAME                = $0000000C;FriendlyName (R/W)
#SPDRP_LOCATION_INFORMATION        = $0000000D;LocationInformation (R/W)
#SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = $0000000E;PhysicalDeviceObjectName (R)
#SPDRP_CAPABILITIES                = $0000000F;Capabilities (R)
#SPDRP_UI_NUMBER                   = $00000010;UiNumber (R)
#SPDRP_UPPERFILTERS                = $00000011;UpperFilters (R/W)
#SPDRP_LOWERFILTERS                = $00000012;LowerFilters (R/W)
#SPDRP_BUSTYPEGUID                 = $00000013;BusTypeGUID (R)
#SPDRP_LEGACYBUSTYPE               = $00000014;LegacyBusType (R)
#SPDRP_BUSNUMBER                   = $00000015;BusNumber (R)
#SPDRP_ENUMERATOR_NAME             = $00000016;Enumerator Name (R)
#SPDRP_SECURITY                    = $00000017;Security (R/W, binary form)
#SPDRP_SECURITY_SDS                = $00000018;Security (W, SDS form)
#SPDRP_DEVTYPE                     = $00000019;Device Type (R/W)
#SPDRP_EXCLUSIVE                   = $0000001A;Device is exclusive-access (R/W)
#SPDRP_CHARACTERISTICS             = $0000001B;Device Characteristics (R/W)
#SPDRP_ADDRESS                     = $0000001C;Device Address (R)
#SPDRP_UI_NUMBER_DESC_FORMAT       = $0000001D;UiNumberDescFormat (R/W)
#SPDRP_DEVICE_POWER_DATA           = $0000001E;Device Power Data (R)
#SPDRP_REMOVAL_POLICY              = $0000001F;Removal Policy (R)
#SPDRP_REMOVAL_POLICY_HW_DEFAULT   = $00000020;Hardware Removal Policy (R)
#SPDRP_REMOVAL_POLICY_OVERRIDE     = $00000021;Removal Policy Override (RW)
#SPDRP_INSTALL_STATE               = $00000022;Device Install State (R)
#SPDRP_LOCATION_PATHS              = $00000023;Device Location Paths (R)
#SPDRP_BASE_CONTAINERID            = $00000024;Base ContainerID (R)

#SPDRP_MAXIMUM_PROPERTY            = $00000025;Upper bound on ordinals


;}
;{;Структуры
Structure _GUID
    Data1.l;
    Data2.u;
    Data3.u;
    Data4.a[8];
EndStructure
;
Structure _SP_DEVINFO_DATA
cbSize.l;Размер в байтах структуры SP_DEVINFO_DATA
ClassGuid._GUID;GUID класса установки устройства
DevInst.l;Непрозрачный дескриптор экземпляра устройства (также известный как дескриптор devnode).
;Некоторые функции, такие как функции SetupDiXxx, принимают всю структуру SP_DEVINFO_DATA в качестве входных данных для идентификации
;устройства в наборе информации об устройстве. Другие функции, такие как функции CM_Xxx, такие как CM_Get_DevNode_Status, принимают этот
;дескриптор DevInst в качестве входных данных.
*Reserved;
EndStructure 
Structure _DEVPROPKEY; представляющию ключ свойства устройства в унифицированной модели свойств устройства
 fmtid._GUID;DEVPROPGUID
 pid.u;DEVPROPID(идентификатора свойства,Идентификатор свойства должен быть больше или равен двум)
EndStructure

;};

ProcedureDLL.i Diologovoe_Okno_Config_Ustroistv()
  
;{;Форма  
 If OpenWindow(#PB_Any, 0, 0,500, 500, "Конфигурация устройств", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  Protected PanelGadget1.i=PanelGadget(#PB_Any,0,0,500,500)
   AddGadgetItem(PanelGadget1, -1, "Все Устройства системы");1-я панель
  Protected TreeGadget1.i=TreeGadget(#PB_Any,0,0,492,400)
  
  Protected Handle = SetupDiGetClassDevs_(#Null,#Null,#Null,#DIGCF_ALLCLASSES) 
  
  Protected DeviceInfoData._SP_DEVINFO_DATA
  ;ZeroMemory(@DeviceInfoData, SizeOf(SP_DEVINFO_DATA));
  DeviceInfoData\cbSize = SizeOf(_SP_DEVINFO_DATA);
  DeviceIndex = 0;
  Protected *BUFF=AllocateMemory(10000)
  Protected kolihestvo_bait.l
  
  AddGadgetItem(TreeGadget1, -1, "Класс установки устройства", 0, 0)
   While SetupDiEnumDeviceInfo_(Handle,DeviceIndex,@DeviceInfoData)<>0; 
     DeviceIndex+1
     
     SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_CLASS,0,*BUFF,10000,0)
      AddGadgetItem(TreeGadget1, -1,PeekS(*BUFF,-1,#PB_Unicode), 0, 1)
      
     SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_CLASSGUID,0,*BUFF,10000,0)
      AddGadgetItem(TreeGadget1, -1,"GUID класса "+PeekS(*BUFF,-1,#PB_Unicode), 0, 2)
      
      ;===========
     SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_FRIENDLYNAME,0,*BUFF,10000,0)
      AddGadgetItem(TreeGadget1, -1,"Понятное имя устройства "+PeekS(*BUFF,-1,#PB_Unicode), 0, 3)
      ;===========

     
     SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_DEVICEDESC,0,*BUFF,10000,0)
      AddGadgetItem(TreeGadget1, -1,"Описание устройства "+PeekS(*BUFF,-1,#PB_Unicode), 0, 3)
      ;==================
     SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_FRIENDLYNAME,0,*BUFF,10000,0)
      AddGadgetItem(TreeGadget1, -1,"Понятное имя устройства "+PeekS(*BUFF,-1,#PB_Unicode), 0, 3)
     ;=================
     
     SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_MFG,0,*BUFF,10000,0)
      AddGadgetItem(TreeGadget1, -1,"Имя производителя устройства. "+PeekS(*BUFF,-1,#PB_Unicode) , 0, 3)

     
     
   Wend
   
   FreeMemory(*BUFF)
 EndIf 
 ;}
 
 
;{;Обработчик сообщений
 Repeat
  Select WaitWindowEvent() 
   Case #PB_Event_CloseWindow;{;
     
         End
     
       ;};
   ;Case #PB_Event_Gadget
    ; Select EventGadget()
          
    ;EndSelect
      
      
  EndSelect    
 ForEver;};     
EndProcedure 



;пример приминения
Diologovoe_Okno_Config_Ustroistv()


Отредактировано Sergeihik (10.09.2022 16:35:08)

0

2

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

Код:
;{Константы setupapi.h
; Коды свойств реестра устройств
; (Коды, помеченные как доступные только для чтения (R), могут использоваться только для
; SetupDiGetDeviceRegistryProperty)
;
; Эти значения должны охватывать один и тот же набор свойств реестра
; как определено кодами CM_DRP в cfgmgr32.h.
;
; Обратите внимание, что коды SPDRP отсчитываются от нуля, а коды CM_DRP отсчитываются от единицы!
#SPDRP_DEVICEDESC                  = $00000000;DeviceDesc (R/W)
#SPDRP_HARDWAREID                  = $00000001;HardwareID (R/W)
#SPDRP_COMPATIBLEIDS               = $00000002;CompatibleIDs (R/W)
#SPDRP_UNUSED0                     = $00000003;unused
#SPDRP_SERVICE                     = $00000004;Service (R/W)
#SPDRP_UNUSED1                     = $00000005;unused
#SPDRP_UNUSED2                     = $00000006;unused
#SPDRP_CLASS                       = $00000007;Class (R--tied To ClassGUID)
#SPDRP_CLASSGUID                   = $00000008;ClassGUID (R/W)
#SPDRP_DRIVER                      = $00000009;Driver (R/W)
#SPDRP_CONFIGFLAGS                 = $0000000A;ConfigFlags (R/W)
#SPDRP_MFG                         = $0000000B;Mfg (R/W)
#SPDRP_FRIENDLYNAME                = $0000000C;FriendlyName (R/W)
#SPDRP_LOCATION_INFORMATION        = $0000000D;LocationInformation (R/W)
#SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = $0000000E;PhysicalDeviceObjectName (R)
#SPDRP_CAPABILITIES                = $0000000F;Capabilities (R)
#SPDRP_UI_NUMBER                   = $00000010;UiNumber (R)
#SPDRP_UPPERFILTERS                = $00000011;UpperFilters (R/W)
#SPDRP_LOWERFILTERS                = $00000012;LowerFilters (R/W)
#SPDRP_BUSTYPEGUID                 = $00000013;BusTypeGUID (R)
#SPDRP_LEGACYBUSTYPE               = $00000014;LegacyBusType (R)
#SPDRP_BUSNUMBER                   = $00000015;BusNumber (R)
#SPDRP_ENUMERATOR_NAME             = $00000016;Enumerator Name (R)
#SPDRP_SECURITY                    = $00000017;Security (R/W, binary form)
#SPDRP_SECURITY_SDS                = $00000018;Security (W, SDS form)
#SPDRP_DEVTYPE                     = $00000019;Device Type (R/W)
#SPDRP_EXCLUSIVE                   = $0000001A;Device is exclusive-access (R/W)
#SPDRP_CHARACTERISTICS             = $0000001B;Device Characteristics (R/W)
#SPDRP_ADDRESS                     = $0000001C;Device Address (R)
#SPDRP_UI_NUMBER_DESC_FORMAT       = $0000001D;UiNumberDescFormat (R/W)
#SPDRP_DEVICE_POWER_DATA           = $0000001E;Device Power Data (R)
#SPDRP_REMOVAL_POLICY              = $0000001F;Removal Policy (R)
#SPDRP_REMOVAL_POLICY_HW_DEFAULT   = $00000020;Hardware Removal Policy (R)
#SPDRP_REMOVAL_POLICY_OVERRIDE     = $00000021;Removal Policy Override (RW)
#SPDRP_INSTALL_STATE               = $00000022;Device Install State (R)
#SPDRP_LOCATION_PATHS              = $00000023;Device Location Paths (R)
#SPDRP_BASE_CONTAINERID            = $00000024;Base ContainerID (R)

#SPDRP_MAXIMUM_PROPERTY            = $00000025;Upper bound on ordinals


;}
;{;Структуры
Structure _GUID
    Data1.l;
    Data2.u;
    Data3.u;
    Data4.a[8];
EndStructure
;
Structure _SP_DEVINFO_DATA
cbSize.l;Размер в байтах структуры SP_DEVINFO_DATA
ClassGuid._GUID;GUID класса установки устройства
DevInst.l;Непрозрачный дескриптор экземпляра устройства (также известный как дескриптор devnode).
;Некоторые функции, такие как функции SetupDiXxx, принимают всю структуру SP_DEVINFO_DATA в качестве входных данных для идентификации
;устройства в наборе информации об устройстве. Другие функции, такие как функции CM_Xxx, такие как CM_Get_DevNode_Status, принимают этот
;дескриптор DevInst в качестве входных данных.
*Reserved;
EndStructure 
Structure _DEVPROPKEY; представляющию ключ свойства устройства в унифицированной модели свойств устройства
 fmtid._GUID;DEVPROPGUID
 pid.u;DEVPROPID(идентификатора свойства,Идентификатор свойства должен быть больше или равен двум)
EndStructure

;};

ProcedureDLL.i Diologovoe_Okno_Config_Ustroistv()
  
;{;Форма  
 If OpenWindow(#PB_Any, 0, 0,500, 500, "Конфигурация устройств", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  Protected PanelGadget1.i=PanelGadget(#PB_Any,0,0,500,500)
   AddGadgetItem(PanelGadget1, -1, "Все Устройства системы");1-я панель
  Protected TreeGadget1.i=TreeGadget(#PB_Any,0,0,492,400)
  
  Protected Handle = SetupDiGetClassDevs_(#Null,#Null,#Null,#DIGCF_ALLCLASSES) 
  
  Protected DeviceInfoData._SP_DEVINFO_DATA
  ;ZeroMemory(@DeviceInfoData, SizeOf(SP_DEVINFO_DATA));
  DeviceInfoData\cbSize = SizeOf(_SP_DEVINFO_DATA);
  Protected DeviceIndex.i = 0;
  Protected *BUFF=AllocateMemory(10000)
  Protected kolihestvo_bait.l
  
  AddGadgetItem(TreeGadget1, -1, "Класс установки устройства", 0, 0)
   While SetupDiEnumDeviceInfo_(Handle,DeviceIndex,@DeviceInfoData)<>0; 
     DeviceIndex+1
     
     SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_CLASS,0,*BUFF,10000,0)
      AddGadgetItem(TreeGadget1, -1,PeekS(*BUFF,-1,#PB_Unicode), 0, 1)
      
     SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_CLASSGUID,0,*BUFF,10000,0)
      AddGadgetItem(TreeGadget1, -1,"GUID класса "+PeekS(*BUFF,-1,#PB_Unicode), 0, 2)
      
     SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_MFG,0,*BUFF,10000,@kolihestvo_bait)
      If kolihestvo_bait>0
       AddGadgetItem(TreeGadget1, -1,"Имя производителя устройства. "+PeekS(*BUFF,-1,#PB_Unicode) , 0, 3)
     EndIf
     
     SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_DEVICEDESC,0,*BUFF,10000,@kolihestvo_bait)
      If kolihestvo_bait>0
       AddGadgetItem(TreeGadget1, -1,"Описание устройства "+PeekS(*BUFF,-1,#PB_Unicode), 0, 3)
      EndIf  
      
     SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_FRIENDLYNAME,0,*BUFF,10000,@kolihestvo_bait)
      If kolihestvo_bait>0
       AddGadgetItem(TreeGadget1, -1,"Понятное имя устройства "+PeekS(*BUFF,-1,#PB_Unicode), 0, 3)
     EndIf
     
     SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_ENUMERATOR_NAME,0,*BUFF,10000,@kolihestvo_bait)
      If kolihestvo_bait>0
       AddGadgetItem(TreeGadget1, -1,"Имя перечислителя устройства "+PeekS(*BUFF,-1,#PB_Unicode), 0, 3)      
     EndIf
     
  ;   SetupDiGetDeviceRegistryProperty_(Handle,@DeviceInfoData,#SPDRP_ADDRESS,0,*BUFF,10000,@kolihestvo_bait)
   ;   If kolihestvo_bait>0
   ;    AddGadgetItem(TreeGadget1, -1,"адрес устройства "+PeekS(*BUFF,-1,#PB_Unicode), 0, 3)
   ;   EndIf
      

      
      
      
      
   Wend
   
   FreeMemory(*BUFF)
 EndIf 
 ;}
 
 
;{;Обработчик сообщений
 Repeat
  Select WaitWindowEvent() 
   Case #PB_Event_CloseWindow;{;
     
         End
     
       ;};
   ;Case #PB_Event_Gadget
    ; Select EventGadget()
          
    ;EndSelect
      
      
  EndSelect    
 ForEver;};     
EndProcedure 



;пример приминения
Diologovoe_Okno_Config_Ustroistv()


Ps;Неплохо бы объединить устройства в один класс которые в нём,но думаю скорость упадёт в разы при проверках....

Отредактировано Sergeihik (10.09.2022 19:43:33)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Что за метаморфозы?