PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Файл pbi с интерфесом


Файл pbi с интерфесом

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

1

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

Код:
;{;Константы  com
;wtypesbase.h
;CLSCTX Значения, которые используются в вызовах активации для указания контекстов выполнения, в которых должен выполняться объект.
;MSHCTX Указывает контекст назначения, т. е. процесс, в котором должна выполняться демаршалировка.
;MSHLFLAGS Указывает, почему должен выполняться маршалинг.
  #CLSCTX_INPROC_SERVER = $1
  #CLSCTX_INPROC_HANDLER = $2
  #CLSCTX_LOCAL_SERVER = $4
  #CLSCTX_INPROC_SERVER16 = $8
  #CLSCTX_REMOTE_SERVER = $10
  #CLSCTX_INPROC_HANDLER16 = $20
  #CLSCTX_RESERVED1 = $40
  #CLSCTX_RESERVED2 = $80
  #CLSCTX_RESERVED3 = $100
  #CLSCTX_RESERVED4 = $200
  #CLSCTX_NO_CODE_DOWNLOAD = $400
  #CLSCTX_RESERVED5 = $800
  #CLSCTX_NO_CUSTOM_MARSHAL = $1000
  #CLSCTX_ENABLE_CODE_DOWNLOAD = $2000
  #CLSCTX_NO_FAILURE_LOG = $4000
  #CLSCTX_DISABLE_AAA = $8000
  #CLSCTX_ENABLE_AAA = $10000
  #CLSCTX_FROM_DEFAULT_CONTEXT = $20000
  #CLSCTX_ACTIVATE_X86_SERVER = $40000
  #CLSCTX_ACTIVATE_32_BIT_SERVER=#CLSCTX_ACTIVATE_X86_SERVER
  #CLSCTX_ACTIVATE_64_BIT_SERVER = $80000
  #CLSCTX_ENABLE_CLOAKING = $100000
  #CLSCTX_APPCONTAINER = $400000
  #CLSCTX_ACTIVATE_AAA_AS_IU = $800000
  #CLSCTX_RESERVED6 = $1000000
  #CLSCTX_ACTIVATE_ARM32_SERVER = $2000000
  ;#CLSCTX_ALLOW_LOWER_TRUST_REGISTRATION=
  #CLSCTX_PS_DLL = $80000000
  ;
  #MSHCTX_LOCAL = 0
  #MSHCTX_NOSHAREDMEM = 1
  #MSHCTX_DIFFERENTMACHINE = 2
  #MSHCTX_INPROC = 3
  #MSHCTX_CROSSCTX = 4
  ;#MSHCTX_CONTAINER
  ;
  #MSHLFLAGS_NORMAL=0
  #MSHLFLAGS_TABLESTRONG=1
  #MSHLFLAGS_TABLEWEAK=2
  #MSHLFLAGS_NOPING=4
  #MSHLFLAGS_RESERVED1=8
  #MSHLFLAGS_RESERVED2=16
  #MSHLFLAGS_RESERVED3=32
  #MSHLFLAGS_RESERVED4=64
  ;==========================
  ;константы ошибок
  #S_OK=0;Успешно
  #S_FALSE=1;Успешно
  #RPC_E_CHANGED_MODE=$80010106;Неизвестная ошибка
  #E_ACCESSDENIED=$80070005;Доступ запрещен.
  #E_FAIL=$80004005;Незаданная ошибка.
  #E_INVALIDARG=$80070057;Недопустимое значение параметра.
  #E_OUTOFMEMORY=$8007000E;Недостаточно памяти
  #E_POINTER=$80004003;Значение NULL было передано неправильно для значения указателя.
  #E_UNEXPECTED=$8000FFFF;Непредвиденное состояние
  
;
;LoadLibraryEx_() загрузка dll
#DONT_RESOLVE_DLL_REFERENCES=$00000001
#LOAD_IGNORE_CODE_AUTHZ_LEVEL=$00000010
#LOAD_LIBRARY_AS_DATAFILE=$00000002
#LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE=$00000040
#LOAD_LIBRARY_AS_IMAGE_RESOURCE=$00000020
#LOAD_LIBRARY_SEARCH_APPLICATION_DIR=$00000200
#LOAD_LIBRARY_SEARCH_DEFAULT_DIRS=$00001000
#LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR=$00000100

#LOAD_LIBRARY_SEARCH_SYSTEM32=$00000800
#LOAD_LIBRARY_SEARCH_USER_DIRS=$00000400
#LOAD_WITH_ALTERED_SEARCH_PATH=$00000008
#LOAD_LIBRARY_REQUIRE_SIGNED_TARGET=$00000080
#LOAD_LIBRARY_SAFE_CURRENT_DIRS=$00002000
;
;CoInitializeEx_() инициализация com
#COINIT_APARTMENTTHREADED = $2;Инициализирует поток для параллелизма объектов с потоком в апартаменте
#COINIT_MULTITHREADED=0;Инициализирует поток для многопоточного параллелизма объектов
#COINIT_DISABLE_OLE1DDE = $4;Отключает поддержку DDE для OLE1.
#COINIT_SPEED_OVER_MEMORY = $8;Увеличьте использование памяти, чтобы повысить производительность.
;};;
;{;Структуры
Structure _GUID;_UUIDv5;формат UUID((UUIDv5))
    Data_l.l;
    Data_w1.u;
    Data_w2.u;
    Data_w3.u;
    Data_b6.a[6];
EndStructure
Structure Object
	*lpVtbl
	nRefCount.l
	nLockCount.l
EndStructure
 ;}; 
;{;Макросы
Macro FAILED(hr) 
hr < 0
EndMacro
Macro SUCCEEDED(hr)
   hr = 0
EndMacro

Macro CLSID_GUID(name, l, w1, w2,w3, b1, b2, b3, b4, b5, b6)
  name\Data_l=l
  name\Data_w1=w1
  name\Data_w2=w2
  name\Data_w3=w3
  name\Data_w3=((name\Data_w3<<8) |(name\Data_w3>>8))
  name\Data_b6[0]=b1
  name\Data_b6[1]=b2
  name\Data_b6[2]=b3
  name\Data_b6[3]=b4
  name\Data_b6[4]=b5
  name\Data_b6[5]=b6
EndMacro
Macro MIDL_INTERFACE(name, l, w1, w2,w3, b1, b2, b3, b4, b5, b6)
  name\Data_l=l
  name\Data_w1=w1
  name\Data_w2=w2
  name\Data_w3=w3
  name\Data_w3=((name\Data_w3<<8) |(name\Data_w3>>8))
  name\Data_b6[0]=b1
  name\Data_b6[1]=b2
  name\Data_b6[2]=b3
  name\Data_b6[3]=b4
  name\Data_b6[4]=b5
  name\Data_b6[5]=b6
  ;name\pid=4
EndMacro
Macro SetDataGuid_CLASS_And_INTERFACE(NameClsid,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,NameInterface,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11)
 DataSection
  NameClsid:
  Data.l p1
  Data.w p2,p3
  Data.b p4,p5,p6,p7,p8,p9,p10,p11
  NameInterface:
  Data.l i1
  Data.w i2,i3
  Data.b i4,i5,i6,i7,i8,i9,i10,i11
 EndDataSection
EndMacro
;};



SetDataGuid_CLASS_And_INTERFACE(CLSID_PortableDeviceManager,$0af10cec,$2ecd,$4b92,$95,$81,$34,$f6,$ae,$06,$37,$f3,IPortableDeviceManager,$a1567595,$4c2f,$4574,$a6,$fa,$ec,$ef,$91,$7b,$9a,$40)

Interface IPortableDeviceManager Extends IUnknown
  GetDevices(*pPnPDeviceIDs,*pcPnPDeviceIDs);Получает список портативных устройств, подключенных к компьютеру.
  RefreshDeviceList();обновляет список устройств, подключенных к компьютеру
  GetDeviceFriendlyName(*pszPnPDeviceID,*pDeviceFriendlyName,*pcchDeviceFriendlyName);Получает понятное имя для устройства
  GetDeviceDescription(*pszPnPDeviceID,*pDeviceDescription,*pcchDeviceDescription);Получает описание устройства
  GetDeviceManufacturer(*pszPnPDeviceID,*pDeviceManufacturer,*pcchDeviceManufacturer);Получает имя производителя устройства.
  GetDeviceProperty(*pszPnPDeviceID,*pszDevicePropertyName,*pData,*pcbData,*pdwType);
  GetPrivateDevices(*pPnPDeviceIDs,*pcPnPDeviceIDs);извлекает список частных портативных устройств, подключенных к компьютеру. Эти частные устройства доступны только через приложение, предназначенное для этих конкретных устройств.
EndInterface

  
Procedure.i EnumerateAllDevices()
    Protected hr
    Protected pnpDeviceIDCount = 0;
    Protected deviceManager.IPortableDeviceManager;интерфейс deviceManager
     CoInitializeEx_(0, 0)
     hr = CoCreateInstance_(?CLSID_PortableDeviceManager,0,#CLSCTX_INPROC_SERVER,?IPortableDeviceManager,@deviceManager);
    If (FAILED(hr))
      Debug"error CoCreateInstance_()"
      End
    EndIf

    If (SUCCEEDED(hr))
        hr = deviceManager\GetDevices(0, @pnpDeviceIDCount)
        If (FAILED(hr))
           Debug"! error deviceManager\GetDevices()"
           deviceManager\Release()
           ProcedureReturn 0
        Else
           Debug "pnpDeviceIDCount   "+Str(pnpDeviceIDCount)
           If pnpDeviceIDCount > 0
              Protected *PWSTR_PnPDeviceIDs.string=AllocateMemory(pnpDeviceIDCount*4);количество ссылок на строку
              Protected *PWSTR_stroka=AllocateMemory(1000);строка для вывода
              Protected PWSTR_stroka_len.i=500
              hr = deviceManager\GetDevices(*PWSTR_PnPDeviceIDs,@pnpDeviceIDCount);
              If (SUCCEEDED(hr))  
                hr=*PWSTR_PnPDeviceIDs
                *PWSTR_PnPDeviceIDs+pnpDeviceIDCount*4-4
               cikl: 
                   Debug *PWSTR_PnPDeviceIDs\s
               
                     deviceManager\GetDeviceFriendlyName(@*PWSTR_PnPDeviceIDs\s,*PWSTR_stroka,@PWSTR_stroka_len)
                     
                     Debug PWSTR_stroka_len
                     Debug PeekS(*PWSTR_stroka,-1,#PB_Unicode)
                     ;
                     deviceManager\GetDeviceDescription(@*PWSTR_PnPDeviceIDs\s,*PWSTR_stroka,@PWSTR_stroka_len)
                     Debug PWSTR_stroka_len
                     Debug PeekS(*PWSTR_stroka,-1,#PB_Unicode)
                     deviceManager\GetDeviceManufacturer(@*PWSTR_PnPDeviceIDs\s,*PWSTR_stroka,@PWSTR_stroka_len)
                     Debug PWSTR_stroka_len
                     Debug PeekS(*PWSTR_stroka,-1,#PB_Unicode) 
                     
                 CoTaskMemFree_(@*PWSTR_PnPDeviceIDs);?
                If *PWSTR_PnPDeviceIDs>hr
                  *PWSTR_PnPDeviceIDs-4
                  Goto cikl
                EndIf
                FreeMemory(*PWSTR_PnPDeviceIDs)
                FreeMemory(*PWSTR_stroka)
                deviceManager\Release()
                ProcedureReturn 1 
              Else
                deviceManager\Release()
                ProcedureReturn 0 
              EndIf
          
 
          Else;нет устройств
             deviceManager\Release()
             ProcedureReturn 0 
          EndIf
        EndIf
    EndIf
EndProcedure
Debug EnumerateAllDevices()

собственно если интерфейс поместить в фыл с расширением pbi и вызвать  XIncludeFile "[имя файла].pbi" то теряется автодополнение кода
ps:повторюсь методы(функции,процедуры)в интерфейсе по расположению должны быть как в инклуднике а то столкнулся на сайте мелкософта свой порядок описания по ним и так расположил ,соответственно таблица ссылок на них нарушена и вылет программы....

Отредактировано Sergeihik (14.10.2023 13:20:55)

0

2

Код:
Structure _GUID;_UUIDv5;формат UUID((UUIDv5))
    Data_l.l;
    Data_w1.u;
    Data_w2.u;
    Data_w3.u;
    Data_b6.a[6];
EndStructure

Неверное объявление.
Должно быть так:
Беззнаковое 32‐битное
Беззнаковое 16‐битное
Беззнаковое 16‐битное
Беззнаковое 8‐битное (8 штук, массив)

Код:
Macro SUCCEEDED(hr)
   hr = 0
EndMacro

Неверное объявление. Успешный код — это не только S_OK, успешных кодов может быть много. Должно быть «больше или равно нулю».

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Файл pbi с интерфесом